Цикл Java HashMap, как словарь Python?
В Python вы можете иметь пары ключ-значение в словаре, где вы можете перебирать их, как показано ниже:
for k,v in d.iteritems():
print k,v
Есть ли способ сделать это с помощью хэш-карт Java?
5 ответов:
Да-например:
Map<String, String> map = new HashMap<String, String>(); // add entries to the map here for (Map.Entry<String, String> entry : map.entrySet()) { String k = entry.getKey(); String v = entry.getValue(); System.out.printf("%s %s\n", k, v); }
Хеш-Карта .entrySet () вернет бобы пар значений ключей, подобных словарю .iteritems () . Затем вы можете пройти через них.
Я думаю, что это ближе всего к версии Python.
Как показано в ответах, существует в основном два способа итерации над
Map
(предположим, что в этих примерахMap<String, String>
).
Перебрать
Map#entrySet()
:for (Entry<String, String> entry : map.entrySet()) { System.out.println(entry.getKey() + "=" + entry.getValue()); }
Перебрать
Map#keySet()
а потом использоватьMap#get()
чтобы получить значение для каждого ключа:for (String key : map.keySet()) { System.out.println(key + "=" + map.get(key)); }
Второй, возможно, более удобочитаем, но он имеет стоимость производительности ненужного вызова
get()
на каждой итерации. Можно возразить, что создание итератор набора ключей дешевле, потому что он не должен учитывать значения. Но хотите верьте, хотите нет, ноkeySet().iterator()
создает и использует тот же итератор, что иentrySet().iterator()
. Единственное отличие состоит в том, что в случаеkeySet()
вызовnext()
итератора возвращаетit.next().getKey()
вместоit.next()
.
AbstractMap#keySet()
's javadoc доказывает это:Метод итератора подкласса возвращает "объект-оболочку" над итераторомentrySet()
этой карты.В Исходный код также подтверждает это. Вот выдержка из метода
keySet()
(где-то около строки 300 в Java 1.6):public Iterator<K> iterator() { return new Iterator<K>() { private Iterator<Entry<K,V>> i = entrySet().iterator(); // <----- public boolean hasNext() { return i.hasNext(); } public K next() { return i.next().getKey(); // <----- } public void remove() { i.remove(); } }; }
Обратите внимание, что читабельность должна быть предпочтительнее преждевременной оптимизации, но важно иметь это в виду.