Подтвердить что ты не робот

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
    }
}

Есть ли простой способ сделать это?

4b9b3361

Ответ 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]