LinkedHashMap
説明には、「すべてのエントリを実行する二重リンクリストを維持する」と記載されているため、最後に入力されたエントリまたはキーを取得する方法を知りたいですか? 自信を持ってダウンキャスト.values()
しLinkedList
て、二重リンク リストを取得し、それを使用でき.getLast()
ますか? それとも、他の Java コレクションのインスタンスですか?
java.util
できれば粘りたい。
LinkedHashMap
説明には、「すべてのエントリを実行する二重リンクリストを維持する」と記載されているため、最後に入力されたエントリまたはキーを取得する方法を知りたいですか? 自信を持ってダウンキャスト.values()
しLinkedList
て、二重リンク リストを取得し、それを使用でき.getLast()
ますか? それとも、他の Java コレクションのインスタンスですか?
java.util
できれば粘りたい。
はい、最後の要素を取得できます。Collection<V>
ただし、返されるの最後の要素を取得するには、他の人からの提案を確認する必要がありますvalues()
。
AbstactCollection<V>
返さLinkedListMap.values()
れた値が実際に期待される順序であることをソース コードで確認しましIterator<V>
たIterator<K>
。そして明らかに、Iterator<K>
オーバーザキーは順序付き二重リンクリストで実装されています。
いいえ、申し訳ありませんが、できません。
「維持された二重リンクリスト」は、java.util.LinkedListタイプまたはその他のコレクションではありません。LinkedHashMapクラスとLinkedHashMap.Entryクラスに手動で実装されます。
LinkedList
ビルドしてからvalues()
使用することしかできませんletLast()
:
Foo last = new LinkedList<Foo>(myLinkedHashMap.values()).getLast();
更新:私の以前の答えは間違っていました。デフォルトの動作を変更せずにそれを行うことはできません! 以下の理由を参照してください。
..最後に入力したエントリまたはキーを取得する方法は?
あなたのAPIの説明からLinkedHashMap
読むことができます:
構造変更とは、1 つ以上のマッピングを追加または削除する操作、またはアクセス順のリンクされたハッシュ マップの場合は反復順序に影響を与える操作です。挿入順リンク ハッシュ マップでは、マップに既に含まれているキーに関連付けられた値を変更するだけでは、構造的な変更にはなりません。アクセス順のリンクされたハッシュ マップでは、get でマップをクエリするだけで、構造的な変更が行われます。
それで、それはどういう意味ですか?
put
-または を実行するたびget
に、要素の順序が変更されます例えば:
map.put(1, 1);
map.put(2, 2);
map.put(1, 10);
System.out.println(map);
... は、挿入順および *アクセス順' で印刷{1=10, 2=2}
されます{2=2, 1=10}
。access-ordered
もちろん操作をすればget
順番も変わってしまうので困っています。
だから... 修正する方法。LinkedHashMap
直接使用することはできません。したがって、それをラップして (陳腐な名前は気にしないでください) 、 メソッドput
とputAll
メソッドをオーバーライドして、マップからキーを削除してから元に戻すことができます!
class BestLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
@Override
public V put(K key, V value) {
V last = super.remove(key);
super.put(key, value);
return last;
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
for (K key : m.keySet())
super.remove(key);
super.putAll(m);
}
}
次に、最後の要素を取得するには、次のいずれかを実行します。
LinkedList
からの出力を実装でラップします。
V v = new LinkedList<V>(map.values()).getLast();
toArray()
仕方:
Collection<V> values = map.values();
V v = values.toArray(new V[0])[values.size() - 1];
イテレータを使用して最後の要素まで反復します。
Iterator<V> it = values.iterator();
V last = null;
while (it.hasNext())
last = it.next();