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
}
}
これを行う簡単な方法はありますか?
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>>
に変更することをお勧めします。実装ではなく、インターフェイスの観点から型を宣言するのが常に最善です。
最初のキーの値のみが必要な場合の一般的な解決策は次のとおりです。
Object firstKey = myHashMap.keySet().toArray()[0];
Object valueForFirstKey = myHashMap.get(firstKey);
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
は、順序を保持する特殊なケースです。
ソリューションはすでに選択されています。ただし、別のアプローチを使用したい人のためにこのソリューションを投稿します。
// 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();
}
for (Object key : data.keySet()) {
String lKey = (String) key;
List<String> list = data.get(key);
}
できるよ:
for(String key: hashMap.keySet()){
for(String value: hashMap.get(key)) {
// use the value here
}
}
これにより、すべてのキーが繰り返され、各キーに関連付けられたリストのすべての値が繰り返されます。
実際のキーを気にしない場合、all Mapの値を反復処理する簡潔な方法は、そのvalues()
メソッドを使用することです
_Map<String, List<String>> myMap;
for ( List<String> stringList : myMap.values() ) {
for ( String myString : stringList ) {
// process the string here
}
}
_
values()
メソッドはMapインターフェイスの一部であり、マップ内の値のコレクションビューを返します。
Kotlin拡張機能を使用できます
fun LinkedHashMap<String, String>.getKeyByPosition(position: Int) =
this.keys.toTypedArray()[position]
fun LinkedHashMap<String, String>.getValueByPosition(position: Int) =
this.values.toTypedArray()[position]
HashMapは、キー/値のペアを特定の順序に保持しません。これらは、各キーがObject.hashCode()メソッドから返すハッシュに基づいて順序付けられます。ただし、次のイテレータを使用してキー/値のペアのセットを反復処理できます。
for (String key : hashmap.keySet())
{
for (list : hashmap.get(key))
{
//list.toString()
}
}