38

LinkedHashMap名前/年齢(文字列/整数)のペアを含む(情報と呼ばれる)があります。キーを入力した場合、キー/値の位置を取得するにはどうすればよいですか? たとえば、LinkedHashMapこのように見え{bob=12, jeremy=42, carly=21}て を検索すると、 1 位にjeremy返されるはずです。1info.getIndex("jeremy")

4

7 に答える 7

31

HashMap一般に、実装は順序付けされていませんIteration

LinkedHashMapは(挿入順序)に対して予測可能な順序で並べられますが、インターフェイスをIteration公開せず、 (キー セットの挿入順序を反映するもの) もインデックス位置自体を追跡しません。インデックスを見つけるのも非常に非効率的です。内部への参照も公開しません。ListLinkedListLinkedHashMapLinkedList

実際の「リンクされたリスト」の動作は実装固有です。いくつかのインスタンスを実際に使用するものもあれば、前と次を追跡し、それを実装として使用するLinkedListだけ のものもあります。ソースを見ずに何も仮定しないでください。EntryEntry

継承されたのKeySetバッキング データ構造に配置するために使用されるハッシュ アルゴリズムのため、キーを含む は順序も保証しませんHashMap。だからあなたはそれを使うことができません。

独自の実装を作成せずにこれを行う唯一の方法Iteratorは、ミラーリングを使用しLinkedListてカウントを維持することです。これは、大規模なデータ セットでは非常に非効率的です。

解決

あなたが望んでいるように聞こえるのは、元の広告掲載オーダーのインデックスの位置です。のサブクラスを作成し、これを内部的に追加し、内部にデリゲートする aを追加することは、おそらくこれを行うための最良の方法です。KeySetArrayListHashMapHashMapIndexedHashMapArrayList.getKeyIndex(<K> key)ArrayList .indexOf()

これは、 の代わりに をLinkedHashMapミラーリングLinkedListした場合の動作です。KeySetArrayList

于 2012-04-30T16:43:10.313 に答える
21
int pos = new ArrayList<String>(info.keySet()).indexOf("jeremy")
于 2015-04-22T06:31:29.940 に答える
0

LinkedHashMap には「予測可能な反復順序」があります ( javadoc )。ただし、アイテムはその場所を認識していないため、コレクションを反復処理して取得する必要があります。大規模なマップを管理している場合は、別の構造をストレージに使用することをお勧めします。

編集:明確化された反復

于 2012-04-30T16:57:05.997 に答える