Javaのハッシュマップを反復処理しようとしましたが、これはかなり簡単なことです。ただし、次のコードにはいくつかの問題があります。
HashMap hm = new HashMap();
hm.put(0, "zero");
hm.put(1, "one");
Iterator iter = (Iterator) hm.keySet().iterator();
while(iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
System.out.println(entry.getKey() + " - " + entry.getValue());
}
最初に、It。をhm.keySet()。iterator()にキャストする必要がありました。それ以外の場合は、「タイプの不一致:Java.util.IteratorからIteratorに変換できません」と言われたためです。しかし、その後、「Iterator型のメソッドhasNext()は未定義」、「Iterator型のメソッドhasNext()は未定義」を取得します。
import
ブロックを確認できますか?間違ったIterator
クラスをインポートしたようです。
使用する必要があるのはJava.util.Iterator
です
確認するには、次を試してください:
Java.util.Iterator iter = hm.keySet().iterator();
私は個人的に以下を提案します:
Generics
を使用した宣言と、インターフェースMap<K,V>
を使用した宣言、および目的の実装HashMap<K,V>
を使用したインスタンス作成
Map<Integer, String> hm = new HashMap<>();
ループの場合:
for (Integer key : hm.keySet()) {
System.out.println("Key = " + key + " - " + hm.get(key));
}
[〜#〜] update [〜#〜]2015/3/5
エントリセットを反復処理する方が、パフォーマンスの点で優れていることがわかりました。
for (Map.Entry<Integer, String> entry : hm.entrySet()) {
Integer key = entry.getKey();
String value = entry.getValue();
}
[〜#〜] update [〜#〜]2017/10/3
Java8およびストリームの場合、ソリューションは(Thanks @Shihe Zhang)です。
hm.forEach((key, value) -> System.out.println(key + ": " + value))
本当にジェネリックと拡張forループを使用する必要があります:
_Map<Integer, String> hm = new HashMap<>();
hm.put(0, "zero");
hm.put(1, "one");
for (Integer key : hm.keySet()) {
System.out.println(key);
System.out.println(hm.get(key));
}
_
またはentrySet()
バージョン:
_Map<Integer, String> hm = new HashMap<>();
hm.put(0, "zero");
hm.put(1, "one");
for (Map.Entry<Integer, String> e : hm.entrySet()) {
System.out.println(e.getKey());
System.out.println(e.getValue());
}
_
Java 8:
hm.forEach((k, v) -> {
System.out.println("Key = " + k + " - " + v);
});
最もクリーンな方法は、イテレーターを(直接)使用しないことです:
このような:
_Map<Integer, String> hm = new HashMap<Integer, String>();
hm.put(0, "zero");
hm.put(1, "one");
for (Map.Entry<Integer, String> entry : hm.entrySet()) {
// do something with the entry
System.out.println(entry.getKey() + " - " + entry.getValue());
// the getters are typed:
Integer key = entry.getKey();
String value = entry.getValue();
}
_
これは、get(key)
へのn回の呼び出しを避けるため、キーを反復処理するよりも効率的です。
ここでいくつかの問題:
import Java.util.Iterator
_を使用しますMap.Entry entry = (Map.Entry) iter.next();
を使用する場合は、hm.entrySet().iterator()
ではなくhm.keySet().iterator()
を使用する必要があります。キーまたはエントリを反復処理します。Map<String, Car> carMap = new HashMap<String, Car>(16, (float) 0.75);
// Mapsのイテレータはありませんが、これを行うメソッドがあります。
Set<String> keys = carMap.keySet(); // returns a set containing all the keys
for(String c : keys)
{
System.out.println(c);
}
Collection<Car> values = carMap.values(); // returns a Collection with all the objects
for(Car c : values)
{
System.out.println(c.getDiscription());
}
/*keySet and the values methods serve as “views” into the Map.
The elements in the set and collection are merely references to the entries in the map,
so any changes made to the elements in the set or collection are reflected in the map, and vice versa.*/
//////////////////////////////////////////////////////////
/*The entrySet method returns a Set of Map.Entry objects.
Entry is an inner interface in the Map interface.
Two of the methods specified by Map.Entry are getKey and getValue.
The getKey method returns the key and getValue returns the value.*/
Set<Map.Entry<String, Car>> cars = carMap.entrySet();
for(Map.Entry<String, Car> e : cars)
{
System.out.println("Keys = " + e.getKey());
System.out.println("Values = " + e.getValue().getDiscription() + "\n");
}
keySet
のイテレータはキーを提供します。エントリを繰り返したい場合は、entrySet
を使用する必要があります。
HashMap hm = new HashMap();
hm.put(0, "zero");
hm.put(1, "one");
Iterator iter = (Iterator) hm.entrySet().iterator();
while(iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
System.out.println(entry.getKey() + " - " + entry.getValue());
}
HashMapでkeySetイテレーターを取得し、エントリーを反復処理することを期待しています。
正しいコード:
HashMap hm = new HashMap();
hm.put(0, "zero");
hm.put(1, "one");
//Here we get the keyset iterator not the Entry iterator
Iterator iter = (Iterator) hm.keySet().iterator();
while(iter.hasNext()) {
//iterator's next() return an Integer that is the key
Integer key = (Integer) iter.next();
//already have the key, now get the value using get() method
System.out.println(key + " - " + hm.get(key));
}
EntrySetを使用したHashMapの繰り返し:
HashMap hm = new HashMap();
hm.put(0, "zero");
hm.put(1, "one");
//Here we get the iterator on the entrySet
Iterator iter = (Iterator) hm.entrySet().iterator();
//Traversing using iterator on entry set
while (iter.hasNext()) {
Entry<Integer,String> entry = (Entry<Integer,String>) iter.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
System.out.println();
//Iterating using for-each construct on Entry Set
Set<Entry<Integer, String>> entrySet = hm.entrySet();
for (Entry<Integer, String> entry : entrySet) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
以下のリンクのセクション-HashMapの走査を見てください。 Java-collection-internal-hashmapおよびHashMapを介したトラバース