我有一个HashMap实现为:
Map<Integer, ArrayList<Integer>> hm = new HashMap<Integer, ArrayList<Integer>>();
Run Code Online (Sandbox Code Playgroud)
执行以下操作后:
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);
Run Code Online (Sandbox Code Playgroud)
我得到我的地图:
1: [2,2,3]
2: [4]
Run Code Online (Sandbox Code Playgroud)
现在,我想从键1中删除2的所有出现,即,我想修改我的HashMap,使其看起来像:
1: [3]
2: [4]
Run Code Online (Sandbox Code Playgroud)
我做了以下事情:
for(List<Integer> list : (hm.get(1)))
{
list.removeAll(Collections.singleton(2));
}
Run Code Online (Sandbox Code Playgroud)
但是,在编译时,会出现此错误:
error: incompatible types
for(List<Integer> list : hm.get(1))
^
required: List<Integer>
found: Integer
1 error
Run Code Online (Sandbox Code Playgroud)
但是,当我跑:
System.out.println((hm.get(1)).getClass());
Run Code Online (Sandbox Code Playgroud)
我明白了:
class java.util.ArrayList
Run Code Online (Sandbox Code Playgroud)
根据其中,我认为,我的代码很好(即使在应用强制转换后,此错误也会以另一种形式显示).
我不知道为什么会这样.我究竟做错了什么?如何解决这个问题?
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));
Run Code Online (Sandbox Code Playgroud)
此外,您的代码中还有一些其他重要问题.例如:
你的方式put():
hm.put((Integer) 1, new ArrayList<Integer>());
Run Code Online (Sandbox Code Playgroud)
写得更好:
hm.put(1, new ArrayList<Integer>());
Run Code Online (Sandbox Code Playgroud)
1将自动装箱到Integer包装.你不必担心这一点.
此外,当您链接方法调用时,不需要用括号括起每个方法调用.所以,
(hm.get(1)).add(2);
Run Code Online (Sandbox Code Playgroud)
写得更好:
hm.get(1).add(2);
Run Code Online (Sandbox Code Playgroud)第三,最好将地图声明为:
Map<Integer, List<Integer>> hm = new HashMap<Integer, List<Integer>>();
Run Code Online (Sandbox Code Playgroud)
它只是为您提供在地图中添加LinkedList或一个ArrayList或任何其他实现的灵活性.
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |