3

HashMapとは異なり、LinkedHashMapでは順序が重要です。そして、ここでの順序は挿入順序です。

次のようなLinkedHashMapがあるとします(上から下に並べられ、左側がキー、右側が値です)。

1:「1つ」

2:「2つ」

3:「3」

4:「4」

次に、キーのリストがあります。これには、たとえば(3,1)が含まれています。

私がやりたいのは、LinkedHashMapを順番にループして、キーがリストにあるエントリを選択することです。

したがって、私が望む結果は次のとおりです(フィルタリング前の順序であるため、1はまだ3より前です):

1:「1つ」

3:「3」

これが私のコードです:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class SelectCertainEntriesFromLinkedHashMap {
    public static void main(String args[]) {
    Map<Integer,String> linkedHashMap = new LinkedHashMap<Integer,String>();
    linkedHashMap.put(1, "One");
    linkedHashMap.put(2, "Twe");
    linkedHashMap.put(3, "Three");
    linkedHashMap.put(4, "Four");

    List<Integer> list = new ArrayList<Integer>();
    list.add(3);
    list.add(1);

    Map<Integer,String> selectedlinkedHashMap = new LinkedHashMap<Integer,String>();

    //will this iterator iterate the keys in the order of the map (1, 2, 3, 4)? Or just random order?
    Iterator<Integer> itr = linkedHashMap.keySet().iterator();
    while(itr.hasNext()) {
        Integer key = itr.next();
        if (list.contains(key)) {
            selectedlinkedHashMap.put(key, linkedHashMap.get(key));
            System.out.println(key + ":" + linkedHashMap.get(key));
        }
    }
}
}

上記のコードは私が好きな結果を返します。しかし、それが保証されているかどうかはわかりません。

1:「1つ」

3:「3」

問題は次のとおりです。イテレータitr=linkedHashMap.keySet()。iterator(); 上記の行はセットからイテレータを取得し、セットは注文されていません。それで、これはランダムな順序でキーを引き起こしますか?はいの場合、フィルタリング後にマップの元の順序(保証されていません)を維持できません。...誰かがこれを手伝ってくれますか?

4

3 に答える 3

5

keySet().iterator() から返される反復子は、順序付けられた Set を返す必要があります。Map APIのドキュメント:

The Map interface provides three collection views, which allow a map's contents to be 
viewed as a set of keys, collection of values, or set of key-value mappings. The order of 
a map is defined as the order in which the iterators on the map's collection views return   
their elements. Some map implementations, like the TreeMap class, make specific guarantees  
as to their order; others, like the HashMap class, do not.

したがって、LinkedHashMap のケースでは、イテレータが順序付けられたセットを返すと解釈します。確かにLinkedHashMap APIはこれについて明示的ではありませんが、試してみて出力を観察することができます。

于 2012-06-14T18:50:26.930 に答える
5

を呼び出すとkeySet()、基になるデータに基づいてキーのビューが作成されます。確かに、明確に文書化されているわけではありませんが、これ単なるビューであるため、そのビューが別の順序で繰り返されるのは非常に奇妙です。

もちろん、実装を確認できますが、問題ないと確信しています。

于 2012-06-14T18:51:47.477 に答える
1

あなたはそれを試しましたか?挿入されたのと同じ順序でそれらを返すかどうかはわかりませんが、この特定のケースでは、取得した KeySet を使用して TreeSet を作成できます。それらは整数であるため、自然な順序になります。1、次に 3。

ちょっと好き:

Set<Integer> set = new TreeSet<Integer>(linkedHashMap.keySet());

于 2012-06-14T18:54:42.283 に答える