Java中HashMap上的迭代器
我尝试在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
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。
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) );
}
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) );
}
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进行并发修改时遇到问题,请询问您的问题以演示该情况。(阿尔托)