2010-10-19 212 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();