1

HashMaps はこれら 2 つの方法で繰り返されるはずですか、それとも列挙は間違っていると見なされますか? 2 つのイテレータ関数を持つ単純なイテレータ プログラムを作成しました。

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

ジェネリックの最初に、'em & love 'em を学びます

次に、keySet にはiterator()すべてのキーを反復処理するメソッドもあります (このEnumerationクラスは非推奨です) 。

entrySet各キーの値も必要な場合は、検索のコストを回避できるため、より良い結果が得られます (マップによっては に移動できます) O(n)

反復コードは次のようになります。

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

Map.entry<keyClass,ValueClass>キーだけが必要な場合は、 for 型の余分な肥大化を避けるために keySet を使用します

于 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 に答える