我有以下代码:
for (Map.Entry < Integer, ArrayList < String >> entry: data.entrySet()) {
Integer key = entry.getKey();
ArrayList < String > value = entry.getValue();
for (String aString: value) {
System.out.println("key : " + key + " value : " + aString);
}
}
Hashmap声明为
Map<Integer, List<String>> data = new HashMap<>();
在通过循环和put
方法填充它之前。
我现在需要迭代字符串ArrayList
或更好的字符串,按索引检索特定元素以进行操作。我已经竭尽所能,似乎已经用上述代码找到了答案。它是从前段时间给出的答案中复制而来的。
但是,当我尝试使用它时,会抱怨“不兼容的类型”,其顶行用红色下划线标记到冒号。
Entry <Integer,java.util.List<java.lang.String>>
Entry <Integer,java.util.ArrayList<java.lang.String>>
答案 0 :(得分:1)
因为您在Hashmap
中将值类型声明为List<String>
,并且在ArrayList<String>
中将Map.Entry
声明为值类型for loop
。
更改从Map<Integer, List<String>> data = new HashMap<>();
到Map<Integer, ArrayList<String>> data = new HashMap<>();
答案 1 :(得分:1)
在您的情况下,您拥有List
接口和ArrayList
实现,您已在地图的声明中正确使用了List
类型,但是您转而声明了一个实现( ArrayList
)。
问题由于以下原因而出现:
Map<Integer, List<String>> data = new HashMap<>();
空菱形符号为List<String>
的实现留下了许多选择。它可以是ArrayList,LinkedList等。因此,您不能确定编译器将使用ArrayList
实现。
建议您执行代码称为针对接口编程,以支持代码可扩展性。保持最通用的类型总是好的,只要可以避免将代码耦合到特定的实现即可,也就是说,当需要对它执行一些具体操作时,您将指定实现。
答案 2 :(得分:0)
尝试以下代码:
for (Map.Entry<Integer, List<String>> entry : data.entrySet()) {
Integer key = entry.getKey();
List<String> value = entry.getValue();
for(String aString : value){
System.out.println("key : " + key + " value : " + aString);
}
答案 3 :(得分:0)
针对接口而不是针对实现进行编程。
地图的类型为Integer
作为键,List<String>
作为值。因此,您只能以相同的结构循环这些条目。
for (Map.Entry < Integer, List < String >> entry: data.entrySet()) {
Integer key = entry.getKey();
List <String> value = entry.getValue();
for (String aString: value) {
System.out.println("key : " + key + " value : " + aString);
}
}