web-dev-qa-db-ja.com

値としてリストを使用してLinkedHashMapを反復処理する方法

次のLinkedHashMap宣言があります。

LinkedHashMap<String, ArrayList<String>> test1

私のポイントは、このハッシュマップをどのように繰り返すことができるかです。私はこれを次のようにしたい、各キーに対して対応するarraylistを取得し、arraylistの値をキーに対して1つずつ印刷します。

これを試しましたが、getは文字列のみを返します。

String key = iterator.next().toString();  
ArrayList<String> value = (ArrayList<String> )test1.get(key)
49
P basak
for (Map.Entry<String, ArrayList<String>> entry : test1.entrySet()) {
    String key = entry.getKey();
    ArrayList<String> value = entry.getValue();
    // now work with key and value...
}

ところで、Map<String, List<String>>などのように、代わりにインターフェイスタイプとして変数を実際に宣言する必要があります。

135
matt b

Getステートメントにタイプミスがあり、test1.get(key)であると仮定しています。もしそうなら、最初に正しいタイプをマップに入れない限り、なぜArrayListを返さないのか分かりません。

これは動作するはずです:

// populate the map
Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>();
test1.put("key1", new ArrayList<String>());
test1.put("key2", new ArrayList<String>());

// loop over the set using an entry set
for( Map.Entry<String,List<String>> entry : test1.entrySet()){
  String key = entry.getKey();
  List<String>value = entry.getValue();
  // ...
}

または使用できます

// second alternative - loop over the keys and get the value per key
for( String key : test1.keySet() ){
  List<String>value = test1.get(key);
  // ...
}

実装を使用して定義する非常に具体的な理由がない限り、varを宣言するとき(および汎用paramsで)インターフェイス名を使用する必要があります。

14
Eric B.
// iterate over the map
for(Entry<String, ArrayList<String>> entry : test1.entrySet()){
    // iterate over each entry
    for(String item : entry.getValue()){
        // print the map's key with each value in the ArrayList
        System.out.println(entry.getKey() + ": " + item);
    }
}
7
Mark Elliot

Java 8の場合:

Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>();
test1.forEach((key,value) -> {
    System.out.println(key + " -> " + value);
});
6
JonDoe297

エントリセットを使用し、エントリを反復処理することにより、キーと値の両方に直接アクセスできます。

for (Entry<String, ArrayList<String>> entry : test1.entrySet() {
     System.out.println(entry.getKey() + "/" + entry.getValue());
}

私はこれを試しましたが、文字列を返すだけです

どうしてそう思うの?メソッド get は、ジェネリック型パラメーターが選択されたタイプEを返します。この場合、ArrayList<String>です。

6
Konrad Reiche