JavaでのHashMapの印刷


129

私はHashMap

private HashMap<TypeKey, TypeValue> example = new HashMap<TypeKey, TypeValue>();

ここで、すべての値を調べて出力したいと思います。

私はこれを書いた:

for (TypeValue name : this.example.keySet()) {
    System.out.println(name);
}

動作しないようです。

何が問題ですか?

編集:別の質問:このコレクションはゼロベースですか?つまり、キーが1つあり、値が0か1か、ということです。


2
Javaのドキュメントに精通することをお勧めします(多くの質問に答えてくれます)。たとえば、これはMapsize()メソッドのドキュメントです。「このマップのキーと値のマッピングの数を返します。マップに複数のInteger.MAX_VALUE要素が含まれている場合は、を返しますInteger.MAX_VALUE。」
Adam Paynter、

あなたのコードはキーの値を探しています-これは正しくありません。キーでキーを探すか、値で値を探す
d-live

2
1つのキー/値がある場合、当然サイズは1になりますが、これはゼロベースのインデックス付けとは何の関係もありません。
Jesper、

これは良い質問です。しかし、Mingfeiの解決策を見れば、1行でこれを行うことができる答えがここに提供されています。
HoldOffHunger 2017年

回答:


140

keySet()はハッシュマップからキーのセットのみを返すため、このキーセットを繰り返し、これらのキーを使用してハッシュマップから値を取得する必要があります。

あなたの例では、ハッシュマップのキーのタイプはTypeKeyですTypeValueが、一般的なforループで指定したため、コンパイルできません。次のように変更する必要があります。

for (TypeKey name: example.keySet()){
            String key = name.toString();
            String value = example.get(name).toString();  
            System.out.println(key + " " + value);  
} 

Java8の更新:

 example.entrySet().forEach(entry->{
    System.out.println(entry.getKey() + " " + entry.getValue());  
 });

キー値を出力する必要がなく、ハッシュマップ値だけが必要な場合は、他の人の提案を使用できます。

別の質問:このコレクションはゼロベースですか?キーが1つあり、値が0または1の場合、

返されたコレクションは、keySet()あるセットのそれはそれはゼロベースまたは1をベースとされているかどうかの問題ではありませんので。あなたは、インデックスを使用して、設定から値を取得することはできません。ハッシュマップに1つのキーがある場合、返されるkeySet()には1つのエントリがあり、そのサイズは1になります。


19
またはより良い:for (Map.Entry<String, String> entry : map.entrySet()) { ... }
Adam Paynter、

2
またはさらにコンパクト: example.forEach((key, value) -> System.out.println("key + " | " + value));
Younes EO

93

キーと値のペアを確認する簡単な方法:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
System.out.println(Arrays.asList(map)); // method 1
System.out.println(Collections.singletonList(map)); // method 2

方法1と方法2の両方がこれを出力します。

[{b=2, a=1}]

21
次のようにしてください:System.out.println(map);、出力:{b=2, a=1}
Mingfei

そうですね...もう1つの同様の出力:System.out.println(map.toString());
Yo Apps

1
この場合、@ yoappsはNPEに注意してください。だからこそ.toString可能な限り避けます。
Maroun

それは本当だ。NPEは常にそのようなショートカットに潜んでいます。私は同様の出力を表示したかっただけです。特に、ログ/コンソールにデバッグしていて、データがnullでないことがわかっているマップを覗き見する場合は特にそう思います。これは速攻です!しかし、コードを最初からチェックする場合は、その通りで、そのトリッキーでプログラミングコンテキストが適切であれば、回避する必要があります。
Yoアプリ

40

があると仮定するとMap<KeyType, ValueType>、次のように印刷できます。

for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
    System.out.println(entry.getKey()+" : "+entry.getValue());
}

16

キーと値の両方を出力するには、以下を使用します。

for (Object objectName : example.keySet()) {
   System.out.println(objectName);
   System.out.println(example.get(objectName));
 }

1
3行目のセミコロンの前に別のブラケットがない。
nktsamba 2018


9

キーセットではなく値セットが必要です。

for (TypeValue name: this.example.values()) {
        System.out.println(name);
}

あなたが与えるコードはコンパイルすらしません、それは将来の質問で言及する価値があるかもしれません-「動作しないようです」は少し曖昧です!


8

Java 8のアプローチ、BiConsumerラムダ関数の使用と言及に値する:

BiConsumer<TypeKey, TypeValue> consumer = (o1, o2) -> 
           System.out.println(o1 + ", " + o2);

example.forEach(consumer);

toString必要に応じて、2つのタイプのメソッドをオーバーライドしたと想定します。


7

私にとって、この単純な1行はうまくいきました:

Arrays.toString(map.entrySet().toArray())

6

ハッシュマップの参照を含む変数名を含む単純な印刷ステートメントは、次のようになります。

HashMap<K,V> HM = new HashMap<>(); //empty
System.out.println(HM); //prints key value pairs enclosed in {}

ので、これは動作しますtoString()方法がすでにオーバー乗られるAbstractMap classことによって拡張されたHashMap Class ドキュメントからのより多くの情報

このマップの文字列表現を返します。文字列表現は、キーと値のマッピングのリストで構成され、マップのentrySetビューのイテレータによって返された順序で、中かっこ( "{}")で囲まれています。隣接するマッピングは、文字「、」(カンマとスペース)で区切られます。各キーと値のマッピングは、キーの後に等号( "=")が続き、その後に関連する値が続くものとしてレンダリングされます。キーと値は、String.valueOf(Object)によって文字列に変換されます。


2
これは上記のものからの最良の答えであるように見えます。
Karan Ahuja

5

Java 8の新機能forEachスタイル

import java.util.HashMap;

public class PrintMap {
    public static void main(String[] args) {
        HashMap<String, Integer> example = new HashMap<>();
        example.put("a", 1);
        example.put("b", 2);
        example.put("c", 3);
        example.put("d", 5);

        example.forEach((key, value) -> System.out.println(key + " : " + value));

//      Output:
//      a : 1
//      b : 2
//      c : 3
//      d : 5

    }
}

4

文字列マップを使用しました(文字列マップを使用している場合)。

for (Object obj : dados.entrySet()) {
    Map.Entry<String, String> entry = (Map.Entry) obj;
    System.out.print("Key: " + entry.getKey());
    System.out.println(", Value: " + entry.getValue());
}

3
map.forEach((key, value) -> System.out.println(key + " " + value));

Java 8機能の使用


3
このコードは問題を解決する可能性がありますが、これが問題を解決する方法と理由の説明含めると、投稿の品質が向上し、おそらく投票数が増えることになります。あなたが今尋ねている人だけでなく、あなたが将来の読者のための質問に答えていることを忘れないでください。回答を編集して説明を追加し、適用される制限と前提を示してください。
Dave

2

HashMapのエントリをすばやく印刷するのに役立ちます

System.out.println(Arrays.toString(map.entrySet().toArray()));

1

マップがコレクションを値として保持している場合、他の回答では、Arrays.deepToString(value.toArray())(リスト値のマップの場合など)など、それらを文字列として変換するための追加の作業が必要です。

私はこれらの問題に頻繁に直面し、を使用してすべてのオブジェクトを印刷するための汎用関数に出くわしましたObjectMappers。これは、すべての場所で、特に実験の際に非常に便利です。この方法を選択することをお勧めします。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public static String convertObjectAsString(Object object) {
    String s = "";
    ObjectMapper om = new ObjectMapper();
    try {
        om.enable(SerializationFeature.INDENT_OUTPUT);
        s = om.writeValueAsString(object);
    } catch (Exception e) {
        log.error("error converting object to string - " + e);
    }
    return s;
}

0

Entryクラスを使ってHashMap簡単に読むことができます。

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.