1

私がしたいのはこれです:

for (Entry<Foo, Foo> myEntry : myMap.entryList())
{
    if (someCondition(myEntry.getKey()))
    {
        doSomething(myEntry.getValue())
    }
}

myEntry.getValue()は後で到達するキーを指すため、順序は重要です。エントリの順序を保証し、その順序でエントリを反復処理できるようにするMap実装はありますか?SortedMapを見つけましたが、SortedMapsがキーを並べ替えているようです。これは私が必要としているものではありません。エントリを配置したのと同じ順序でマップからエントリを取得したいだけです。

私が何をしようとしているのか疑問に思っている人のために、myMapはFooオブジェクトの階層を表しています。'someCondition'で条件が満たされると、Fooの親(たまたまエントリの値)をマークします。後で親がキーになると、以前にマークを付けたことがあることがわかり、それに応じてアクションを実行します。今、再帰的な「markParent」呼び出しを作成しましたが、既知の順序でマップを反復処理できれば、それを行う必要はありません。

4

2 に答える 2

7

あなたは好きLinkedHashMapですか?;-)

予測可能な反復順序を使用しMapた、インターフェイスのハッシュテーブルとリンクリストの実装。この実装は、すべてのエントリを介して実行される二重リンクリストを維持するという点で異なります。このリンクリストは、反復順序を定義します。これは通常、キーがマップに挿入された順序(挿入順序)です。キーがマップに再挿入されても、挿入順序は影響を受けないことに注意してください。(呼び出される直前にtrueが返される場合、キーがマップに再挿入されます。)HashMapkmm.put(k, v)m.containsKey(k)

(私の強調)

FWIW、私がそこにたどり着いた方法、将来同様の情報を見つける必要がある場合に役立つ:JDKクラスの1つがそれを行ったという漠然とした思い出があったのでMap、「既知の実装クラス」のリストにアクセスして読みました。この場合、名前は見たときに知っていましたが、知らなくてもLinkedHashMapわかりますので、順番を教えてください... :-)

于 2013-03-12T18:59:03.003 に答える
0

LinkedHashMapは、LinkedListを内部的に使用する挿入の順序を維持します。また、カスタムオーダーを定義する場合は、代わりにTreeMapのようなSortedMapを使用できます。

于 2019-06-06T03:23:40.393 に答える