1

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 函数),这是唯一正确的方法吗?

4

3 回答 3

2

第一个泛型,学习他们并爱他们

其次,keySet 还有一个iterator()迭代所有键的方法(Enumeration该类已弃用)

当我还需要每个键的值时,我会发现entrySet更好,这样我就可以避免搜索成本(取决于地图可以转到O(n)

迭代代码归结为:

for(Map.Entry<KeyClass,ValueClass> e:hMap){
    KeyClass key = e.getKey();
    ValueClass value = e.getValue();
    //...
}

如果我只需要密钥,我将使用 keySet 来避免Map.entry<keyClass,ValueClass>for 类型的额外膨胀

于 2013-03-23T19:54:02.903 回答
1

最简单的方法是使用新的增强for循环(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() + "]");
    }
}
于 2013-03-23T19:55:18.230 回答
0

是你与地图交互的方式吗?如果是这样,您可能使用了错误的数据结构。

无论如何,您的 iteratorEnumeration 方法的问题是,一旦您获得了键迭代器,就应该对其进行迭代,每次都从映射中获取值。你不需要打电话 hMap.elements();

于 2013-03-23T19:54:09.973 回答