17

私は、またはのLinkedHashMapいずれかである多くの人と働いています。LinkedHashMap<Long, Long>LinkedHashMap<Long, Double>LinkedHashMap<Long, Integer>

List<Long>私の目的は、上記のすべてのキーをLinkedHashMap<Long,...> 同じ順序で返すメソッドを見つけるか作成することです。myMap.keySet()順序は重要です。そのため、これは使用できないと思いますSet<Long>。また、入力としてのみ受け入れるメソッドが他にもたくさんあるList<Long>ので、これらのメソッドを引き続き使用できるように、目的のメソッドがそのオブジェクト型で返されるようにしたいと考えています。

たとえば a に対して this を返すメソッドを書くのLinkedHashMap<Long, Long>は簡単です:

private static List<Long> getLongKeys(LinkedHashMap<Long, Long> target) {
    List<Long> keys = new ArrayList<Long>();

    for(Map.Entry<Long, Long> t : target.entrySet()) {
        keys.add(t.getKey());
    }
    return keys;
}

ただし、 と を除いてほぼ同じメソッドを記述する必要がLinkedHashMap<Long, Double>ありLinkedHashMap<Long, Integer>ます。

LinkedHashMap<Long, Long>、またはの 3 つのタイプすべてを受け入れるために貼り付けたメソッドを一般化する方法はありますLinkedHashMap<Long, Double>LinkedHashMap<Long, Integer>?

4

2 に答える 2

24

順序は重要であるため、 Set である myMap.keySet() を使用できないと思います

Map#keySet()メソッドはLinkedHashMap、セットを挿入順に返します。Mapドキュメントからの引用は次のとおりです。

マップの順序は、マップのコレクション ビューの反復子が要素を返す順序として定義されます。TreeMap クラスなどの一部のマップ実装は、その順序に関して特定の保証を行います。HashMap クラスなどの他のクラスはそうではありません。

したがって、そのための別のメソッドを記述する必要はありません。keySet()や などのメソッドentrySet()は、広告掲載順のエントリのみを返します。


本当に が必要な場合はList<Keys>、次のように直接実行できます。

List<Long> keys = new ArrayList<>(target.keySet());

..リストが必要な場所ならどこでも。メソッドはまったく必要ありません。

于 2013-09-21T07:00:33.940 に答える
4

LinkedHashMapの一貫した順序付けは、キー、値、およびエントリに適用されます。

あなたはうまくやっているはずです:

ArrayList<Long> keys = new ArrayList<>(target.keySet());

さらに保証が必要な場合は、 のソース コードを参照してくださいLinkedHashMap。重要な部分:

private class KeyIterator extends LinkedHashIterator<K> {
    public K next() { return nextEntry().getKey(); }
}

private class ValueIterator extends LinkedHashIterator<V> {
    public V next() { return nextEntry().value; }
}

private class EntryIterator extends LinkedHashIterator<Map.Entry<K,V>> {
    public Map.Entry<K,V> next() { return nextEntry(); }
}

// These Overrides alter the behavior of superclass view iterator() methods
Iterator<K> newKeyIterator()   { return new KeyIterator();   }
Iterator<V> newValueIterator() { return new ValueIterator(); }
Iterator<Map.Entry<K,V>> newEntryIterator() { return new EntryIterator(); }

したがって、キー、値、およびエントリの反復子はすべてnextEntry()、反復順序にリンク リストを使用する同じソース ( ) から取得されます。

于 2013-09-21T07:09:36.357 に答える