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

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

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

есть ли способ сделать это с помощью Java HashMaps?

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

на HashMap.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() на каждой итерации. Можно утверждать, что создание итератора набора ключей дешевле, потому что ему не нужно учитывать значения. Но хотите верьте, хотите нет, но ... --9--> создает и использует то же самое итератор as entrySet().iterator(). Единственное отличие заключается в том, что в случае keySet() the next() вызов итератора возвращает it.next().getKey() вместо it.next().

на AbstractMap#keySet()'ы документации доказывает это:

метод итератора подкласса возвращает "объект-оболочку"надentrySet() итератор.

на AbstractMap исходный код также доказывает это. Вот выдержка из 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));
    }