60

我有以下 LinkedHashMap 声明。

LinkedHashMap<String, ArrayList<String>> test1

我的观点是我如何遍历这个哈希图。我想在下面执行此操作,为每个键获取相应的数组列表并针对该键一一打印数组列表的值。

我试过这个但只得到返回字符串,

String key = iterator.next().toString();  
ArrayList<String> value = (ArrayList<String> )test1.get(key)
4

5 回答 5

153
for (Map.Entry<String, ArrayList<String>> entry : test1.entrySet()) {
    String key = entry.getKey();
    ArrayList<String> value = entry.getValue();
    // now work with key and value...
}

顺便说一句,您应该真正将变量声明为接口类型,例如Map<String, List<String>>.

于 2012-09-07T02:28:10.127 回答
14

我假设你的 get 语句中有错字,它应该是 test1.get(key)。如果是这样,我不确定为什么它不返回 ArrayList ,除非您首先没有在地图中输入正确的类型。

这应该有效:

// populate the map
Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>();
test1.put("key1", new ArrayList<String>());
test1.put("key2", new ArrayList<String>());

// loop over the set using an entry set
for( Map.Entry<String,List<String>> entry : test1.entrySet()){
  String key = entry.getKey();
  List<String>value = entry.getValue();
  // ...
}

或者你可以使用

// second alternative - loop over the keys and get the value per key
for( String key : test1.keySet() ){
  List<String>value = test1.get(key);
  // ...
}

在声明变量(以及在通用参数中)时,您应该使用接口名称,除非您有非常具体的原因来定义使用实现。

于 2012-09-07T02:32:58.690 回答
11

在 Java 8 中:

Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>();
test1.forEach((key,value) -> {
    System.out.println(key + " -> " + value);
});
于 2017-04-22T22:27:59.520 回答
8

您可以使用条目集并迭代允许您直接访问键和值的条目。

for (Entry<String, ArrayList<String>> entry : test1.entrySet()) {
     System.out.println(entry.getKey() + "/" + entry.getValue());
}

我试过了,但只得到返回字符串

你为什么这么认为?在您的情况下,该方法get返回E选择泛型类型参数的类型ArrayList<String>

于 2012-09-07T02:28:36.007 回答
7
// iterate over the map
for(Entry<String, ArrayList<String>> entry : test1.entrySet()){
    // iterate over each entry
    for(String item : entry.getValue()){
        // print the map's key with each value in the ArrayList
        System.out.println(entry.getKey() + ": " + item);
    }
}
于 2012-09-07T02:28:39.193 回答