2010-10-19 108 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 2016-02-02 22:08:56

回答

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 2010-10-19 23:45:20

7

未訂購散列地圖,除非您使用LinkedHashMapSortedMap。在這種情況下,您可能需要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(指數),因爲它是鍵/值對的無序列表。 LinkedHashMap是保持訂單的特殊情況。

1

你可以這樣做:

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

這將每一個關鍵迭代,然後與每個鍵相關聯的列表中的每個值。

+0

感謝每個人回答。 Jjnguy,這正是我想要的。你也是,kkress。 – Derek 2010-10-20 03:11:55

+0

@derek,很高興我能幫到你。 – jjnguy 2010-10-20 03:47:50

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

以及要非常嚴格...... OP要求*值*,而不是*鍵*。所以你可能想添加'Object myValue = myMap.get(myKey);' – avalancha 2014-03-14 10:07:33

+0

我不確定'toArray()'的(潛在)開銷是否超過了'iterator()。next()'... – Matthieu 2015-05-28 12:54:41

0

如果你不關心實際鍵,簡潔的方式來遍歷所有該圖的值將使用其values()方法

Map<String, List<String>> myMap; 

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

values()方法是Map接口的一部分,並返回地圖中值的Collection視圖。

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();