web-dev-qa-db-ja.com

JavaのHashMapのイテレータ

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()は未定義」を取得します。

16
cerebrou

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))
43
Garis M Suero

本当にジェネリックと拡張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));
}
_

http://ideone.com/sx3F0K

または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());
}
_
6
millimoose

Java 8:

hm.forEach((k, v) -> {
    System.out.println("Key = " + k + " - " + v);
});
4
Misi

最もクリーンな方法は、イテレーターを(直接)使用しないことです:

  • ジェネリックを使用してマップを入力します
  • foreachループを使用して、エントリを反復処理します。

このような:

_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回の呼び出しを避けるため、キーを反復処理するよりも効率的です。

0
Bohemian

ここでいくつかの問題:

  • おそらく正しいイテレータクラスを使用しないでしょう。他の人が言ったように、_import Java.util.Iterator_を使用します
  • Map.Entry entry = (Map.Entry) iter.next();を使用する場合は、hm.entrySet().iterator()ではなくhm.keySet().iterator()を使用する必要があります。キーまたはエントリを反復処理します。
0
Steph
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");

        }
0

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

}
0
Nitin Rahoria

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を介したトラバース

0
Avi Tyagi