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
}
}
Есть ли простой способ сделать это?
Ответы
Ответ 1
Вы можете перебирать клавиши, вызывая 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>>
. Всегда лучше объявлять типы с точки зрения интерфейса, а не реализации.
Ответ 2
Вот общее решение, если вы действительно хотите только значение ключа
Object firstKey = myHashMap.keySet().toArray()[0];
Object valueForFirstKey = myHashMap.get(firstKey);
Ответ 3
HashMaps не заказываются, если вы не используете LinkedHashMap
или SortedMap
. В этом случае вам может понадобиться 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
- это особый случай, который сохраняет порядок.
Ответ 4
for (Object key : data.keySet()) {
String lKey = (String) key;
List<String> list = data.get(key);
}
Ответ 5
Решение уже выбрано. Однако я публикую это решение для тех, кто хочет использовать альтернативный подход:
// 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();
}
Ответ 6
Вы можете сделать:
for(String key: hashMap.keySet()){
for(String value: hashMap.get(key)) {
// use the value here
}
}
Это будет выполнять итерацию по каждому ключу, а затем каждое значение списка, связанного с каждой клавишей.
Ответ 7
HashMaps не сохраняет пары ключ/значение в определенном порядке. Они упорядочиваются на основе хэша, который возвращает каждый ключ из метода Object.hashCode(). Однако вы можете перебирать набор пар ключ/значение, используя итератор, с помощью:
for (String key : hashmap.keySet())
{
for (list : hashmap.get(key))
{
//list.toString()
}
}
Ответ 8
Если вам не нужен фактический ключ, кратким способом итерации по всем значениям карты будет использование метода values()
Map<String, List<String>> myMap;
for ( List<String> stringList : myMap.values() ) {
for ( String myString : stringList ) {
// process the string here
}
}
Метод values()
является частью интерфейса карты и возвращает представление коллекции значений на карте.
Ответ 9
Вы можете использовать функцию расширения Kotlin
fun LinkedHashMap<String, String>.getKeyByPosition(position: Int) =
this.keys.toTypedArray()[position]
fun LinkedHashMap<String, String>.getValueByPosition(position: Int) =
this.values.toTypedArray()[position]