LinkedHashMap
名前/年齢(文字列/整数)のペアを含む(情報と呼ばれる)があります。キーを入力した場合、キー/値の位置を取得するにはどうすればよいですか? たとえば、LinkedHashMap
このように見え{bob=12, jeremy=42, carly=21}
て を検索すると、 1 位にjeremy
返されるはずです。1
info.getIndex("jeremy")
7 に答える
HashMap
一般に、実装は順序付けされていませんIteration
。
LinkedHashMap
は(挿入順序)に対して予測可能な順序で並べられますが、インターフェイスをIteration
公開せず、 (キー セットの挿入順序を反映するもの) もインデックス位置自体を追跡しません。インデックスを見つけるのも非常に非効率的です。内部への参照も公開しません。List
LinkedList
LinkedHashMap
LinkedList
実際の「リンクされたリスト」の動作は実装固有です。いくつかのインスタンスを実際に使用するものもあれば、前と次を追跡し、それを実装として使用する
LinkedList
だけ のものもあります。ソースを見ずに何も仮定しないでください。Entry
Entry
継承されたのKeySet
バッキング データ構造に配置するために使用されるハッシュ アルゴリズムのため、キーを含む は順序も保証しませんHashMap
。だからあなたはそれを使うことができません。
独自の実装を作成せずにこれを行う唯一の方法Iterator
は、ミラーリングを使用しLinkedList
てカウントを維持することです。これは、大規模なデータ セットでは非常に非効率的です。
解決
あなたが望んでいるように聞こえるのは、元の広告掲載オーダーのインデックスの位置です。のサブクラスを作成し、これを内部的に追加し、内部にデリゲートする aを追加することは、おそらくこれを行うための最良の方法です。KeySet
ArrayList
HashMap
HashMap
IndexedHashMap
ArrayList
.getKeyIndex(<K> key)
ArrayList
.indexOf()
これは、 の代わりに をLinkedHashMap
ミラーリングLinkedList
した場合の動作です。KeySet
ArrayList
int pos = new ArrayList<String>(info.keySet()).indexOf("jeremy")
LinkedHashMap には「予測可能な反復順序」があります ( javadoc )。ただし、アイテムはその場所を認識していないため、コレクションを反復処理して取得する必要があります。大規模なマップを管理している場合は、別の構造をストレージに使用することをお勧めします。
編集:明確化された反復