我有一个HashMap实现为:
Map<Integer, ArrayList<Integer>> hm = new HashMap<Integer, ArrayList<Integer>>();
执行以下操作后:
hm.put((Integer) 1, new ArrayList<Integer>());
hm.put((Integer) 2, new ArrayList<Integer>());
(hm.get(1)).add(2);
(hm.get(1)).add(2);
(hm.get(1)).add(3);
(hm.get(2)).add(4);
我的地图为:
1: [2,2,3]
2: [4]
现在,我想从键1中删除2的所有出现,即,我想修改我的HashMap,使其看起来像:
1: [3]
2: [4]
我做了以下事情:
for(List<Integer> list : (hm.get(1)))
{
list.removeAll(Collections.singleton(2));
}
但是,在编译时,会出现此错误:
error: incompatible types
for(List<Integer> list : hm.get(1))
^
required: List<Integer>
found: Integer
1 error
然而,当我跑步时:
System.out.println((hm.get(1)).getClass());
我明白了:
class java.util.ArrayList
据我所知,我的代码很好(即使在使用强制转换后,此错误也会以其他形式显示)。
我不知道为什么会这样。我究竟做错了什么?如何解决这个问题?
答案 0 :(得分:5)
for-each
循环中的变量类型应与您正在迭代的 Collection 中存储的元素的类型保持一致。
hm.get(1)
会将List<Integer>
映射到密钥1
。对List<Integer>
进行迭代将获得Integer
,而您正尝试将其存储在List<Integer>
中。 for-each
变量应为Integer
而不是List<Integer>
。更好int
,因为Integer
无论如何都会被取消装箱到int
。
话虽如此,根本不需要那个循环。只需以下代码即可:
hm.get(1).removeAll(Collections.singleton(2));
此外,您的代码中还有一些其他重要问题。例如:
您的行为put()
:
hm.put((Integer) 1, new ArrayList<Integer>());
最好写成:
hm.put(1, new ArrayList<Integer>());
1
将自动装箱到Integer
包装。你不必担心这一点。
此外,在链接方法调用时,不需要用括号括起每个方法调用。所以,
(hm.get(1)).add(2);
最好写成:
hm.get(1).add(2);
第三,最好将地图声明为:
Map<Integer, List<Integer>> hm = new HashMap<Integer, List<Integer>>();
它只是为您提供了在地图中添加LinkedList
或ArrayList
或任何其他实现的灵活性。
答案 1 :(得分:3)
您正试图遍历List<Integer>
,而不是直接使用它。跳过for
循环,然后执行
hm.get(1).removeAll(Collections.singleton(2));