Итериране по елементите на 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());
}
Естествено резултатът е същия като горе.
Няма коментари
Обратно към списъка със статиите
Тази страница последно е променяна на 2025-04-29 13:52:39