Итериране по елементите на Java Map

 

Map имплементациите в Java са изключително полезни структури за съхраняване на ключ -> стойност релации. Най-честата употреба е извличането на елемент, асоцииран с даден ключ. Но в някои случаи се налага да се обходят всички елементи в картата. Тук ще покажем няколко примера как да стане това. Нека имаме следната структура:

Map<String, String> countryCodes = new HashMap<String, String>();
countryCodes.put("Bulgaria", "bg");
countryCodes.put("India", "in");
countryCodes.put("Germany", "de");


Итериране по ключовете на картата
 


За обхождане на всички ключове се ползва подобна конструкция:

Iterator<String> countryIterator = countryCodes.keySet().iterator();
while (countryIterator.hasNext()) {
    String code = countryIterator.next();
    System.out.println(code);
}


Резултата от изпълнението на този фрагмент е:

Bulgaria
Germany
India


Обърнете внимание, че реда на изписване е различен от този, който сме задали при създаването на картата. Това е защото се ползва HashMap, която използва функцията hashCode() за разпределяне на ключовете. В крайна сметка се получава привидно случайно разпределение.
 


Обхождане на стойностите
 


Следния фрагмент се използва за извличане на всички стойности. Той е много подобен на горния пример:

Iterator<String> codeIterator = countryCodes.values().iterator();
while (codeIterator.hasNext()) {
    String code = codeIterator.next();
    System.out.println(code);
}


Резултатът тук е:

bg
de
in


Итериране по цялото съдържание
 


Сега да обединим двата горни примера - ще изведем всички ключове в картата, заедно с всяка асоциирана стойност. На първо време нека модифицираме леко първия пример:

Iterator<String> countryIterator1 = countryCodes.keySet().iterator();
while (countryIterator1.hasNext()) {
    String country = countryIterator1.next();
    System.out.println(country + ": " + countryCodes.get(country));
}

Резултатът е както и очаквахме:

Bulgaria: bg
Germany: de
India: in

След по-внимателно разглеждане обаче забелязваме, че на всяка итерация се добавя по едно извличане на елемент. Това е сравнително бърза операция, а и нашия пример е доста малък, но при големи обеми данни това би се усетило в производителността. Така че оптимизираме примера:

Iterator<Map.Entry<String, String>> mapIterator = countryCodes.entrySet().iterator();
while (mapIterator.hasNext()) {
    Map.Entry<String, String> entry = mapIterator.next();
    System.out.println(entry.getKey() + ": " + entry.getValue());
}    

Естествено резултатът е същия като горе.
 

Няма коментари

Обратно към списъка със статиите

Тази страница последно е променяна на 2024-04-27 15:28:16