Как перебрать LinkedHashMap со списками значений

у меня есть следующее объявление LinkedHashMap.

LinkedHashMap<String, ArrayList<String>> test1

моя точка зрения заключается в том, как я могу перебрать этот хэш-карте. Я хочу сделать это следующим образом, для каждого ключа получите соответствующий arraylist и распечатайте значения arraylist один за другим против ключа.

Я пробовал это, но get возвращает только строку

String key = iterator.next().toString();  
ArrayList<String> value = (ArrayList<String> )test1.get(key)

5 ответов


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>>.


Я предполагаю, что у вас есть опечатка в вашем заявлении get и что это должен быть test1.получить (ключ). Если это так, я не уверен, почему он не возвращает 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);
  // ...
}

вы должны использовать имена интерфейса при объявлении ваших vars (и в ваших общих параметрах), если у вас нет очень конкретной причины, по которой вы определяете использование реализация.


// 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);
    }
}

вы можете использовать набор записей и перебирать записи, что позволяет получить доступ как к ключу, так и к значению напрямую.

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

Я пробовал это, но получить только возвращает строку

Почему вы так думаете? Метод get возвращает значение типа E для которого был выбран параметр универсального типа, в вашем случае ArrayList<String>.


В Java 8:

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