[英]Iterating over a HashMap, two ways: iterating with entry set & iterating with enumeration
是否应该以这两种方式迭代HashMaps,或者枚举被认为是错误的? 我用两个迭代器函数创建了一个简单的迭代器程序:
import java.util.*;
public class HashMapIterators
{
public static void main(String[] args)
{
HashMap<String, Integer> hMap = new HashMap<String, Integer>();
hMap.put("abc", 10);
hMap.put("pqr", 20);
hMap.put("asd", 30);
hMap.put("xyz", 40);
iteratorEnumeration(hMap);
iteratorEntrySet(hMap);
}
public static void iteratorEnumeration(HashMap hMap)
{
System.out.println("iteratorEnumeration");
Iterator it = hMap.keySet().iterator();
Enumeration em = hMap.elements(); // doesn't work
Enumeration em = new IteratorEnumeration(it); // doesn't work
// while(em.hasMoreElements())
{
}
}
public static void iteratorEntrySet(HashMap hMap)
{
System.out.println("iteratorEntrySet");
Iterator it = hMap.entrySet().iterator();
while(it.hasNext())
{
Map.Entry me = (Map.Entry)it.next();
System.out.println("Key: [" + me.getKey() + "], Value: [" + me.getValue() + "]");
}
}
}
iteratorEnumeration函数不起作用,我猜这些方法(如elements())仅适用于HashTable。 纠正我,如果我错了,我不知道什么时候使用什么功能是合适的。 所以,我的主要问题是 - 我们应该通过在entrySet方法上设置迭代器来迭代HashMap(请参阅我的iteratorEntrySet函数),这是唯一正确的方法吗?
首先是仿制药,学习他们并爱他们
第二,keySet还有一个iterator()
所有键的iterator()
方法(不推荐使用Enumeration
类)
当我还需要每个键的值时,我发现entrySet
更好,所以我可以避免搜索的成本(这取决于地图可以转到O(n)
)
迭代代码归结为:
for(Map.Entry<KeyClass,ValueClass> e:hMap){
KeyClass key = e.getKey();
ValueClass value = e.getValue();
//...
}
如果我只需要键,我将使用keySet,以避免for类型中的Map.entry<keyClass,ValueClass>
的额外膨胀
最简单的方法是使用新的Enhanced for
Loop (Foreach),以及如下的泛型:
static <K, V> void iterateForEach(Map<K, V> map)
{
for(Map.Entry<K, V> entry : map.entrySet())
{
System.out.println("Key: [" + entry.getKey() + "], Value: [" + entry.getValue() + "]");
}
}
你与地图互动的方式是什么? 如果是这样,您可能正在使用错误的数据结构。
无论如何,你的iteratorEnumeration方法的问题是,一旦你获得了关键迭代器,你应该迭代它,每次都从地图中获取值。 你不需要调用hMap.elements();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.