Java中HashMap上的迭代器

Java中HashMap上的迭代器,java,map,iterator,Java,Map,Iterator,我尝试在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

我尝试在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()上强制转换迭代器,因为否则它会说“类型不匹配:无法从java.util.Iterator转换为Iterator”。但是我得到了“类型迭代器的方法hasNext()未定义”和“类型迭代器的方法hasNext()未定义”。

您应该使用泛型和增强的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));
}

我们可以看到您的
导入
块吗?因为您似乎导入了错误的
迭代器

您应该使用的是
java.util.Iterator

要确保这一点,请尝试:

java.util.Iterator iter = hm.keySet().iterator();

我个人建议如下:

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

    }
     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());  
    }           
使用接口映射声明和使用接口映射声明以及使用所需实现创建实例

更新2015年3月5日

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

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

}

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

  • 用泛型键入地图
  • 使用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();
}
Map hm=newhashmap();
hm.put(0,“零”);
hm.put(1,“一”);
对于(Map.Entry:hm.entrySet()){
//对条目做些什么
System.out.println(entry.getKey()+“-”+entry.getValue());
//getter类型为:
整数key=entry.getKey();
字符串值=entry.getValue();
}
这比迭代键更有效,因为您避免了n次调用
get(key)

这里有几个问题:

  • 您可能没有使用正确的迭代器类。正如其他人所说,使用
    import java.util.Iterator
  • 如果要使用
    Map.Entry=(Map.Entry)iter.next()
    然后需要使用
    hm.entrySet().iterator()
    ,而不是
    hm.keySet().iterator()
    。可以对键进行迭代,也可以对条目进行迭代
Map carMap=新的HashMap(16,(浮点)0.75);
//映射没有迭代器,但有一些方法可以做到这一点

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

        }
Set keys=carMap.keySet();//返回包含所有键的集
用于(字符串c:键)
{
系统输出打印ln(c);
}
集合值=carMap.values();//返回包含所有对象的集合
对于(车辆c:值)
{
System.out.println(c.getDescription());
}
/*keySet和values方法充当映射中的“视图”。
集合和集合中的元素只是对映射中条目的引用,
因此,对集合或集合中的元素所做的任何更改都会反映在映射中,反之亦然*/
//////////////////////////////////////////////////////////
/*entrySet方法返回一组Map.Entry对象。
条目是映射接口中的内部接口。
Map.Entry指定的两个方法是getKey和getValue。
getKey方法返回键,getValue返回值*/
Set cars=carMap.entrySet();
用于(地图入口e:汽车)
{
System.out.println(“Keys=“+e.getKey());
System.out.println(“Values=“+e.getValue().GetDescription()+”\n”);
}
使用Java 8:

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

迭代器通过
键集
将为您提供键。如果要迭代条目,应使用
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上获得一个键集迭代器,并期望对条目进行迭代

正确的代码:

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

    }
     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());  
    }           
使用EntrySet在HashMap上迭代:

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

    }
     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 hm=newhashmap();
hm.put(0,“零”);
hm.put(1,“一”);
//这里我们得到入口集上的迭代器
迭代器iter=(迭代器)hm.entrySet().Iterator();
//在条目集上使用迭代器进行遍历
而(iter.hasNext()){
Entry=(Entry)iter.next();
System.out.println(“Key=“+entry.getKey()+”,Value=“+entry.getValue());
}  
System.out.println();
//对条目集上的每个构造使用迭代
Set entrySet=hm.entrySet();
对于(条目:entrySet){
System.out.println(“Key=“+entry.getKey()+”,Value=“+entry.getValue());
}           
查看下面链接中的部分-遍历HashMap

  • 使用EntrySet()和for each循环

       for(Map.Entry<String, String> entry: hashMap.entrySet()) {
         System.out.println("Key Of map = "+ entry.getKey() + 
                          " , value of map = " + entry.getValue() );
     }
    
             for(String key : hashMap.keySet()) {
                System.out.println("Key Of map = "+ key + " , 
                          value of map = " + hashMap.get(key) );
               }
    
  • 使用EntrySet()和java迭代器

          for(String key : hashMap.keySet()) {
            System.out.println("Key Of map = "+ key + " , 
                          value of map = " + hashMap.get(key) );
            }
    
         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) );
       }
    
  • 使用keyset()和java迭代器

          for(String key : hashMap.keySet()) {
            System.out.println("Key Of map = "+ key + " , 
                          value of map = " + hashMap.get(key) );
            }
    
         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) );
       }
    
    Iterator-keysIterator=keySet.Iterator();
    while(keysIterator.hasNext()){
    String key=keysIterator.next();
    System.out.println(“map的Key=“+Key+”,map的value=“+hashMap.get(Key));
    }
    

  • Reference

    听起来您导入了错误的
    迭代器类。你需要导入
    java.util.Iterator
    。如果你想要的是Entries而不是keySet(),你需要在entrySet()上循环。你能指定这两种方法之间的区别吗???@HussainAkhtarWahid'Ghouri'实际上没有-这就是为什么我没有提到任何方法的原因。第二个可能会更快,因为您避免了每次迭代时的哈希查找。(或者可能不是。)如果他需要修改他的地图怎么办?这将导致并发修改异常。@Eddnav,但OP从未提及他有,或询问过,他接受了与我基本相同的不同答案。正如所问,修改地图显然不是问题所在;如果您在使用Java HashMap进行并发修改时遇到问题,请询问您的问题以演示该情况。(阿尔托)