2010-10-19 4 views
21

Я пытаюсь использовать HashMap, чтобы отобразить уникальную строку в строку ArrayList, как это:Java HashMap: Как получить ключ и значение по индексу?

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

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

+0

если вы хотите «только» самый первый элемент, см http://stackoverflow.com/a/1936472/32453 – rogerdpack

ответ

26

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

+0

хороший ответ !!! вы избили меня до этого :) – JJunior

7

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

Там нет прямого прибудете (индекс) в карте, поскольку она представляет собой неупорядоченный список пар ключ/значение. LinkedHashMap - это особый случай, который сохраняет порядок.

1

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

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

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

+0

Благодаря все, кто отвечал. Jjnguy, это именно то, что я хотел. Вы тоже, ккресс. – Derek

+0

@derek, рад, что я мог бы помочь. – jjnguy

0

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

for (String key : hashmap.keySet()) 
{ 
    for (list : hashmap.get(key)) 
    { 
     //list.toString() 
    } 
} 
2
for (Object key : data.keySet()) { 
    String lKey = (String) key; 
    List<String> list = data.get(key); 
} 
52

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

Object firstKey = myHashMap.keySet().toArray()[0]; 
Object valueForFirstKey = myHashMap.get(firstKey); 
+6

Хорошо, чтобы быть очень строгим ... ОП запросил * значение *, а не * ключ *. Поэтому вы можете добавить 'Object myValue = myMap.get (myKey);' – avalancha

+0

Я не уверен, что (потенциальные) накладные расходы 'toArray()' превосходят 'iterator(). Next()' ... – Matthieu

0

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

Map<String, List<String>> myMap; 

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

values() является частью интерфейса карты и возвращает представление коллекции значений на карте.

0

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

// use LinkedHashMap if you want to read values from the hashmap in the same order as you put them into it 
LinkedHashMap <String, ArrayList<String>> myhashmap = new LinkedHashMap <String, ArrayList<String>>(); 

// fill myhashmap ... 

// get the first value (arraylist) from the hashmap 
Map.Entry<String, ArrayList<String>> entry = (Map.Entry<String, ArrayList<String>>) myhashmap.entrySet().toArray()[0]; 
ArrayList<String> arrayList = entry.getValue(); 
Смежные вопросы