Цикл Java HashMap, как словарь Python?


В Python вы можете иметь пары ключ-значение в словаре, где вы можете перебирать их, как показано ниже:

for k,v in d.iteritems():
    print k,v

Есть ли способ сделать это с помощью хэш-карт Java?

5 7

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

  1. Перебрать Map#entrySet():

    for (Entry<String, String> entry : map.entrySet()) {
        System.out.println(entry.getKey() + "=" + entry.getValue());
    }
    
  2. Перебрать 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();
        }
    };
}

Обратите внимание, что читабельность должна быть предпочтительнее преждевременной оптимизации, но важно иметь это в виду.
Set<Map.Entry> set = d.entrySet();
for(Map.Entry i : set){
  System.out.println(i.getKey().toString() + i.getValue().toString);
}

Что-то вроде этого...

В Java вы можете сделать то же самое, как показано ниже.

    HashMap<String, String> h = new HashMap<String, String>();
    h.put("1","one");
    h.put("2","two");
    h.put("3","three");

    for(String key:h.keySet()){
        System.out.println("Key: "+ key + " Value: " + h.get(key));
    }