Почему мы используем метод entrySet() и используем возвращаемый набор для итерации карты?
Обычно мы пишем это, чтобы получить ключи и значения с карты.
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());
}
Почему мы итерации используем набор, почему нет прямой карты?
Ответы
Ответ 1
Это как можно ближе к итерации по карте, поскольку мы можем сказать, хотите ли вы просто клавиши, просто значения или всю запись ключа/значения. Для наборов и списков существует только один вариант, поэтому нет необходимости иметь отдельный метод для этого.
BTW: Так я буду перебирать карту. Обратите внимание на использование generics, 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));
Ответ 2
Поскольку логически карта представляет собой набор Set пар ключ-значение - это то, что представляет Map.Entry. Итерация - это операция в коллекции, а не карта.
Тем не менее, я часто задавался вопросом, почему Map
не реализует Iterable<Map.Entry<K,V>>
et al и предоставляет метод iterator()
поверх записей карты напрямую, а не требует набора записей (что, безусловно, может предоставить полный API Set
.
Ответ 3
Карта - это совокупность пар вещей, справа (Записи). Таким образом, вы можете перебирать записи или перебирать только ключи (map.keySet()) или только по значению (map.values ()). Что еще вы хотите, чтобы выполнить итерацию?
Ответ 4
Потому что Java не имеет лучшего синтаксиса для этого. (Ваш может быть улучшен)
Было бы неплохо
for(String key, Integer val : map)
print(key, val);
или
map.foreach (String key, Integer val) -> print(key, val);
но Java не имеет этих данных.