Java中HashMap上的迭代器

2022-09-02 05:19:17

我试图在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());

}

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


答案 1

我们可以看到您的区块吗?因为您似乎导入了错误的类。importIterator

你应该使用的那个是java.util.Iterator

为确保安全,请尝试:

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

我个人建议如下:

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

更新 3/5/2015

发现迭代 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))

答案 2

为此,您确实应该使用泛型和增强的 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());
}