2

Map<Integer, Integer>ビアインデックスにアクセスするのはトッシーベですか?

マップの 2 番目の要素を取得する必要があります。

4

8 に答える 8

9

間違ったデータ構造を使用しています。キーで検索する必要がある場合は、Map. インデックスまたは挿入順序で検索する必要がある場合は、配列、リスト、リンク リストなど、インデックスを作成できるものを使用します。

両方でルックアップする必要がある場合は、キーと挿入順序の両方を追跡する複合データ構造を作成する必要があります (実装はMap、上記のデータ構造の および 1 つによってサポートされます)。

フレームワークに組み込まれているものもあります: LinkedHashMap.

于 2013-06-13T13:30:23.230 に答える
2

「インデックスを介して」マップに直接アクセスする方法はありませんがLinkedHashMap、予測可能な反復順序を提供するが必要なようです。

... 通常、これはキーがマップに挿入された順序 (insertion-order)です。キーがマップに再挿入されても、挿入順序は影響を受けないことに注意してください。(キーは、呼び出しの直前に返されるときに呼び出された場合k、マップに再挿入されます。)mm.put(k, v)m.containsKey(k)true

于 2013-06-13T13:31:22.030 に答える
0

Mapデフォルトでは順序付きコレクションではないため、 index の定義は には適用されません。

TreeMapを実装する を使用してから、メソッドNavigableMapを使用してキー セットを反復できます。navigableKeySet()

于 2013-06-13T13:32:28.527 に答える
0

常に 2 番目の要素を取得する必要がある場合。イテレータを使用してから next ,next を実行してみませんか。

于 2013-06-13T13:32:56.400 に答える
0

Apache commons-collection から org.apache.commons.collections.map.ListOrderedMap を使用することもできます。Map を実装し、get(int index) や remove(int index) などの List インターフェイスからいくつかのメソッドを提供します。

内部で ArrayList を使用するため、Map を反復処理して指定された位置の値を取得するよりもパフォーマンスが向上します。

于 2013-06-13T13:41:32.793 に答える
0

これが「よりクリーン」かどうかはわかりませんが、 LinkedHashMap を使用し、2番目に挿入された要素を取得したい場合は、次のように機能します

List keys = new ArrayList(map.keySet());
Object obj = map.get(keys.get(1));
    //do you staff here 
于 2013-06-13T13:58:00.117 に答える
0

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"

これはあなたが望むものです。

于 2013-06-13T13:31:05.673 に答える
0

これは 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);
于 2013-06-13T13:37:56.823 に答える