_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つのタイプすべてを受け入れる方法はありますか?
順序が重要であるため、セットであるmyMap.keySet()を使用できないと思います。
LinkedHashMap
のMap#keySet()
メソッドは、挿入順にセットを返します。 Map
ドキュメントからの引用は次のとおりです。
マップの順序は、マップのコレクションビューのイテレータが要素を返す順序として定義されます。 TreeMapクラスのような一部のマップ実装は、それらの順序に関して特定の保証を行います。 HashMapクラスのような他のものはそうではありません。
したがって、そのために別のメソッドを作成する必要はありません。 keySet()
やentrySet()
のようなメソッドは、挿入順でのみエントリを返します。
さて、本当にList<Keys>
が必要な場合は、直接行うことができます。
List<Long> keys = new ArrayList<>(target.keySet());
..リストが必要な場所ならどこでも。このメソッドはまったく必要ありません。
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()
)から取得されます。