web-dev-qa-db-ja.com

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

なぜ直接マップしないのか、なぜセットを使用して反復するのですか?

18
priya

これは、キーだけ、値だけ、またはキー/値エントリ全体のいずれを必要とするかを指定する必要があるため、可能な限りマップの反復処理に近いです。セットとリストの場合、オプションは1つしかないため、これを行うために別のメソッドを用意する必要はありません。

ところで:これは私がマップを反復する方法です。ジェネリック、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));
26
Peter Lawrey

論理的には、マップはキーと値のペアのSet collectionであるため、Map.Entryはこれを表します。反復は、一般にコレクションに対する操作であり、具体的にはマップではありません。

ただし、Mapが_Iterable<Map.Entry<K,V>>_などを実装せず、マップセットエントリに対してiterator()メソッドを直接提供するのではなく、エントリセット(もちろん、完全なSet AP​​Iを提供することもできます。

5
Lawrence Dol

マップは、正しいもの(エントリ)のペアのコレクションです。したがって、エントリを反復処理したり、キーのみ(map.keySet())を反復処理したり、値のみ(map.values())を反復処理したりできます。他に何を反復できるようにしたいですか?

3
iluxa

Javaにはそれを行うためのより良い構文はありません。(あなたはそれを改善することができます)

それはいいですね

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

または

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

しかしJavaにはこれらはありません。

2
irreputable