Цикл Java HashMap, как словарь Python? - PullRequest
7 голосов
/ 01 июля 2010

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

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

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

Ответы [ 5 ]

20 голосов
/ 01 июля 2010

Да - например:

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);
}
6 голосов
/ 01 июля 2010

Как показано в ответах, существует два способа итерации по 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().

Javadoc AbstractMap#keySet() доказываетthis:

Метод итератора подкласса возвращает «объект-оболочку» поверх 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();
        }
    };
}

Обратите внимание, что читаемость должна быть предпочтительнее преждевременной оптимизации, но важно иметь это в виду.

6 голосов
/ 01 июля 2010

HashMap.entrySet () будет возвращать бины пар ключ-значение, аналогичные dictionary.iteritems () .Затем вы можете просмотреть их.

Я думаю, что это самая близкая вещь к версии Python.

3 голосов
/ 01 июля 2010
Set<Map.Entry> set = d.entrySet();
for(Map.Entry i : set){
  System.out.println(i.getKey().toString() + i.getValue().toString);
}

Как-то так ...

1 голос
/ 01 июля 2010

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