Почему мы используем метод entrySet () и используем возвращенный набор для итерации карты? - PullRequest
17 голосов
/ 25 марта 2011

Обычно мы пишем это, чтобы получить ключи и значения из карты.

Map m=new HashMap();
Set s=map.entrySet();
Iterator i=s.iterator()
while(s.hasNext()){
    Map.Entry m= (map.Entry) s.next();
    System.out.println(""+m.getKey()+""+ m.getValue());
}

Почему мы выполняем итерацию, используя набор, а не непосредственно карту?

Ответы [ 4 ]

26 голосов
/ 25 марта 2011

Это как можно ближе к итерации по карте, поскольку мы должны сказать, хотите ли вы только ключи, только значения или всю запись ключ / значение.Для наборов и списков есть только одна опция, поэтому нет необходимости иметь отдельный метод для этого.

Кстати: так я бы итерировал карту.Обратите внимание на использование обобщений, цикла for-each и LinkedHashMap, поэтому записи отображаются в некотором логическом порядке.TreeMap был бы другим хорошим выбором.

Map<K,V> m=new LinkedHashMap<K,V>();
for(Map.Entry<K,V> entry: m.entrySet())
    System.out.println(entry.getKey() + ": " + entry.getValue());

В Java 8 вы можете написать

m.forEach((k, v) -> System.out.println(k + ": " + v));
5 голосов
/ 25 марта 2011

Поскольку, по логике, карта - это набор набор пар ключ-значение - это то, что представляет Map.Entry. Итерация - это вообще операция над коллекцией, а не карта.

Тем не менее, я часто задавался вопросом, почему Map не реализует Iterable<Map.Entry<K,V>> и др. И не предоставляет метод iterator() непосредственно для записей карты вместо того, чтобы требовать набор записей (что, безусловно, может быть сделано и для предоставить полный Set API.

3 голосов
/ 25 марта 2011

Карта представляет собой набор пар вещей, верно (Записи). Таким образом, вы можете перебирать записи или перебирать только ключи (map.keySet ()) или только значение (map.values ​​()). Что еще вы хотите иметь возможность повторять?

2 голосов
/ 25 марта 2011

Потому что у Java нет лучшего синтаксиса для этого. (Ваш может быть улучшен)

Было бы неплохо

for(String key, Integer val : map)
    print(key, val);

или

map.foreach (String key, Integer val) -> print(key, val);

но у Java их нет.

...