web-dev-qa-db-ja.com

Java HashMap:インデックスでキーと値を取得する方法は?

HashMapを使用して、一意の文字列を次のような文字列ArrayListにマッピングしようとしています。

HashMap<String, ArrayList<String>>

基本的に、キーの名前を使用するのではなく、番号でキーにアクセスできるようにします。そして、そのキーの値にアクセスして繰り返し処理できるようにしたいと思います。私はこのようなものを想像しています:

for(all keys in my hashmap) {
    for(int i=0; i < myhashmap.currentKey.getValue.size(); i++) {
        // do things with the hashmaps elements
    }
}

これを行う簡単な方法はありますか?

27
Derek

map.keySet()を呼び出してキーを反復処理するか、map.entrySet()を呼び出してエントリを反復処理できます。エントリの反復処理はおそらく高速になります。

for (Map.Entry<String, List<String>> entry : map.entrySet()) {
    List<String> list = entry.getValue();
    // Do things with the list
}

挿入したのと同じ順序でキーを繰り返し処理したい場合は、LinkedHashMapを使用します。

ところで、マップの宣言されたタイプを<String, List<String>>に変更することをお勧めします。実装ではなく、インターフェイスの観点から型を宣言するのが常に最善です。

33
Cameron Skinner

最初のキーの値のみが必要な場合の一般的な解決策は次のとおりです。

Object firstKey = myHashMap.keySet().toArray()[0];
Object valueForFirstKey = myHashMap.get(firstKey);
62
dumonderic

LinkedHashMapまたはSortedMapを使用しない限り、HashMapは順序付けられません。この場合、LinkedHashMapが必要になる場合があります。これは、挿入の順に(または、必要に応じて最後のアクセスの順に)繰り返されます。この場合、それは

int index = 0;
for ( Map.Entry<String,ArrayList<String>> e : myHashMap.iterator().entrySet() ) {
    String key = e.getKey();
    ArrayList<String> val = e.getValue();
    index++;
}

マップはキー/値ペアの順不同リストであるため、マップには直接get(index)はありません。 LinkedHashMapは、順序を保持する特殊なケースです。

8
Jeff Storey

ソリューションはすでに選択されています。ただし、別のアプローチを使用したい人のためにこのソリューションを投稿します。

// use LinkedHashMap if you want to read values from the hashmap in the same order as you put them into it
private ArrayList<String> getMapValueAt(LinkedHashMap<String, ArrayList<String>> hashMap, int index)
{
    Map.Entry<String, ArrayList<String>> entry = (Map.Entry<String, ArrayList<String>>) hashMap.entrySet().toArray()[index];
    return entry.getValue();
}
2
Ayaz Alifov
for (Object key : data.keySet()) {
    String lKey = (String) key;
    List<String> list = data.get(key);
}
2
umesh

できるよ:

for(String key: hashMap.keySet()){
    for(String value: hashMap.get(key)) {
        // use the value here
    }
}

これにより、すべてのキーが繰り返され、各キーに関連付けられたリストのすべての値が繰り返されます。

1
jjnguy

実際のキーを気にしない場合、all Mapの値を反復処理する簡潔な方法は、そのvalues()メソッドを使用することです

_Map<String, List<String>> myMap;

for ( List<String> stringList : myMap.values() ) {
    for ( String myString : stringList ) {
        // process the string here
    }
}
_

values()メソッドはMapインターフェイスの一部であり、マップ内の値のコレクションビューを返します。

0
fspinnenhirn

Kotlin拡張機能を使用できます

fun LinkedHashMap<String, String>.getKeyByPosition(position: Int) =
        this.keys.toTypedArray()[position]


fun LinkedHashMap<String, String>.getValueByPosition(position: Int) =
        this.values.toTypedArray()[position]
0
Makwana Mehul

HashMapは、キー/値のペアを特定の順序に保持しません。これらは、各キーがObject.hashCode()メソッドから返すハッシュに基づいて順序付けられます。ただし、次のイテレータを使用してキー/値のペアのセットを反復処理できます。

for (String key : hashmap.keySet()) 
{
    for (list : hashmap.get(key))
    {
        //list.toString()
    }
}
0
kkress