20

我尝试在 Java 中迭代 hashmap,这应该是一件相当容易的事情。但是,以下代码给我带来了一些问题:

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

}

首先,我需要在 hm.keySet().iterator() 上强制转换 Iterator,否则会显示“类型不匹配:无法从 java.util.Iterator 转换为 Iterator”。但后来我得到“方法 hasNext() 对于迭代器类型未定义”,并且“方法 hasNext() 对于迭代器类型未定义”。

4

9 回答 9

47

我们可以看看你的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));
}

2015 年 3 月 5 日更新

发现迭代 Entry 集将获得更好的性能:

for (Map.Entry<Integer, String> entry : hm.entrySet()) {
    Integer key = entry.getKey();
    String value = entry.getValue();

}

2017 年 10 月 3 日更新

对于 Java8 和流,您的解决方案将是(感谢@Shihe Zhang)

 hm.forEach((key, value) -> System.out.println(key + ": " + value))
于 2013-03-15T00:05:58.790 回答
6

你真的应该为此使用泛型和增强的 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());
}
于 2013-03-15T00:05:03.130 回答
4

使用 Java 8:

hm.forEach((k, v) -> {
    System.out.println("Key = " + k + " - " + v);
});
于 2015-09-02T20:10:09.563 回答
0

最干净的方法是根本不(直接)使用迭代器:

  • 用泛型输入你的地图
  • 使用 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();
}

这比遍历键更有效,因为您避免了 n 次调用get(key).

于 2013-03-15T00:09:12.077 回答
0

这里有几个问题:

  • 您可能没有使用正确的迭代器类。正如其他人所说,使用import java.util.Iterator
  • 如果你想使用,Map.Entry entry = (Map.Entry) iter.next();那么你需要使用hm.entrySet().iterator(),而不是hm.keySet().iterator()。要么迭代键,要么迭代条目。
于 2013-03-15T00:10:13.370 回答
0
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");

        }
于 2013-03-15T00:44:15.013 回答
0

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

查看以下链接中的部分 -遍历 HashMapjava-collection-internal-hashmap和遍历HashMap

于 2019-06-21T15:33:23.580 回答
0
  1. 使用 EntrySet() 并为每个循环

       for(Map.Entry<String, String> entry: hashMap.entrySet()) {
         System.out.println("Key Of map = "+ entry.getKey() + 
                          " , value of map = " + entry.getValue() );
     }
    
  2. 使用 keyset() 并为每个循环

             for(String key : hashMap.keySet()) {
                System.out.println("Key Of map = "+ key + " , 
                          value of map = " + hashMap.get(key) );
               }
    
  3. 使用 EntrySet() 和 java 迭代器

          for(String key : hashMap.keySet()) {
            System.out.println("Key Of map = "+ key + " , 
                          value of map = " + hashMap.get(key) );
            }
    
  4. 使用 keyset() 和 java 迭代器

         Iterator<String> keysIterator = keySet.iterator();
        while (keysIterator.hasNext()) {
            String key = keysIterator.next();
            System.out.println("Key Of map = "+ key + " , value of map = " + hashMap.get(key) );
       }
    

参考如何在 Java 中迭代 Map 或 HashMap

于 2021-01-27T17:01:47.527 回答
-1

迭代器通过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());

}
于 2017-08-25T14:48:55.920 回答