Java HashMap: как получить ключ и значение по индексу? - PullRequest
27 голосов
/ 20 октября 2010

Я пытаюсь использовать 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
    }
}

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

Ответы [ 8 ]

62 голосов
/ 13 мая 2013

Вот общее решение, если вы действительно хотите только значение первого ключа

Object firstKey = myHashMap.keySet().toArray()[0];
Object valueForFirstKey = myHashMap.get(firstKey);
31 голосов
/ 20 октября 2010

Вы можете перебирать ключи, вызывая 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>>.Всегда лучше объявлять типы в терминах интерфейса, а не реализации.

8 голосов
/ 20 октября 2010

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 - это особый случай, в котором хранится порядок.

2 голосов
/ 22 июня 2015

Решение уже выбрано.Тем не менее, я публикую это решение для тех, кто хочет использовать альтернативный подход:

// 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 голосов
/ 13 марта 2013
for (Object key : data.keySet()) {
    String lKey = (String) key;
    List<String> list = data.get(key);
}
1 голос
/ 20 октября 2010

Вы можете сделать:

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

Это будет повторять каждый ключ, а затем каждое значение списка, связанного с каждым ключом.

0 голосов
/ 04 января 2014

Если вас не волнует фактический ключ, краткий способ перебрать все значения карты будет использовать values() метод

Map<String, List<String>> myMap;

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

The *Метод 1007 * является частью интерфейса Map и возвращает представление Collection значений на карте.

0 голосов
/ 20 октября 2010

HashMaps не хранит ваши пары ключ / значение в определенном порядке. Они упорядочены на основе хеша, который каждый ключ возвращает из метода Object.hashCode (). Однако вы можете перебирать набор пар ключ / значение, используя итератор с:

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