web-dev-qa-db-ja.com

LinkedHashMapからすべてのキーをリストに抽出するメソッド

_LinkedHashMap<Long, Long>_、_LinkedHashMap<Long, Double>_、または_LinkedHashMap<Long, Integer>_のいずれかである多くのLinkedHashMapを使用しています。

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

たとえば、_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>_、_LinkedHashMap<Long, Double>_、または_LinkedHashMap<Long, Integer>_の3つのタイプすべてを受け入れる方法はありますか?

16
user2763361

順序が重要であるため、セットであるmyMap.keySet()を使用できないと思います。

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

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

したがって、そのために別のメソッドを作成する必要はありません。 keySet()entrySet()のようなメソッドは、挿入順でのみエントリを返します。


さて、本当にList<Keys>が必要な場合は、直接行うことができます。

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

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

20
Rohit Jain

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())から取得されます。

4
prunge