7

LinkedHashMap説明には、「すべてのエントリを実行する二重リンクリストを維持する」と記載されているため、最後に入力されたエントリまたはキーを取得する方法を知りたいですか? 自信を持ってダウンキャスト.values()LinkedListて、二重リンク リストを取得し、それを使用でき.getLast()ますか? それとも、他の Java コレクションのインスタンスですか?

java.utilできれば粘りたい。

4

4 に答える 4

1

はい、最後の要素を取得できます。Collection<V>ただし、返されるの最後の要素を取得するには、他の人からの提案を確認する必要がありますvalues()

AbstactCollection<V>返さLinkedListMap.values()れた値が実際に期待される順序であることをソース コードで確認しましIterator<V>Iterator<K>。そして明らかに、Iterator<K>オーバーザキーは順序付き二重リンクリストで実装されています。

于 2011-09-03T12:30:54.073 に答える
0

いいえ、申し訳ありませんが、できません。

「維持された二重リンクリスト」は、java.util.LinkedListタイプまたはその他のコレクションではありません。LinkedHashMapクラスとLinkedHashMap.Entryクラスに手動で実装されます。

LinkedListビルドしてからvalues()使用することしかできませんletLast()

Foo last = new LinkedList<Foo>(myLinkedHashMap.values()).getLast();
于 2011-09-03T12:04:42.593 に答える
0

更新:私の以前の答えは間違っていました。デフォルトの動作を変更せずにそれを行うことはできません! 以下の理由を参照してください。


..最後に入力したエントリまたはキーを取得する方法は?

あなたの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直接使用することはできません。したがって、それをラップして (陳腐な名前は気にしないでください) 、 メソッドputputAllメソッドをオーバーライドして、マップからキーを削除してから元に戻すことができます!

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();
    
于 2011-09-03T19:56:16.250 に答える