Map<Integer, Integer>
ビアインデックスにアクセスするのはトッシーベですか?
マップの 2 番目の要素を取得する必要があります。
間違ったデータ構造を使用しています。キーで検索する必要がある場合は、Map
. インデックスまたは挿入順序で検索する必要がある場合は、配列、リスト、リンク リストなど、インデックスを作成できるものを使用します。
両方でルックアップする必要がある場合は、キーと挿入順序の両方を追跡する複合データ構造を作成する必要があります (実装はMap
、上記のデータ構造の および 1 つによってサポートされます)。
フレームワークに組み込まれているものもあります: LinkedHashMap
.
「インデックスを介して」マップに直接アクセスする方法はありませんがLinkedHashMap
、予測可能な反復順序を提供するが必要なようです。
... 通常、これはキーがマップに挿入された順序 (insertion-order)です。キーがマップに再挿入されても、挿入順序は影響を受けないことに注意してください。(キーは、呼び出しの直前に返されるときに呼び出された場合
k
、マップに再挿入されます。)m
m.put(k, v)
m.containsKey(k)
true
Map
デフォルトでは順序付きコレクションではないため、 index の定義は には適用されません。
TreeMap
を実装する を使用してから、メソッドNavigableMap
を使用してキー セットを反復できます。navigableKeySet()
常に 2 番目の要素を取得する必要がある場合。イテレータを使用してから next ,next を実行してみませんか。
Apache commons-collection から org.apache.commons.collections.map.ListOrderedMap を使用することもできます。Map を実装し、get(int index) や remove(int index) などの List インターフェイスからいくつかのメソッドを提供します。
内部で ArrayList を使用するため、Map を反復処理して指定された位置の値を取得するよりもパフォーマンスが向上します。
これが「よりクリーン」かどうかはわかりませんが、 LinkedHashMap を使用し、2番目に挿入された要素を取得したい場合は、次のように機能します
List keys = new ArrayList(map.keySet());
Object obj = map.get(keys.get(1));
//do you staff here
Map は要素を挿入順に格納しません。格納されている要素のhashCodeの値に基づいて、要素をバケットに格納します。いいえ、インデックスで取得することはできません。
とにかく、インターフェースのLinkedHashMap実装を使用して、このようなものを模倣できMap
ます。これは、挿入順序を記憶します ( HashMapのリンクを解除します)。
手動のインデックス カウンターで「ハッキング」する必要があり、コードは次のようになります。
Map<String, String> map= new LinkedHashMap<>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
int index= 0;
for (String key : map.keySet()) {
if (index++ == 1) {
System.out.println(map.get(key));
}
}
印刷します:
"two"
これはあなたが望むものです。
これは Map の実装に依存しますが、2 番目に挿入された要素を取得する場合は、LinkedHashMap を使用してから、値に対して反復子を作成できます。
Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();
map.put(1, 1);
map.put(2, 2);
Integer value = null;
if (map.size() > 1) {
Iterator<Integer> iterator = map.values().iterator();
for (int i = 0; i < 2; i++) {
value = iterator.next();
}
}
// value contains second element
System.out.println(value);