1

我有一个 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

据此,我认为我的代码很好(即使在应用强制转换之后,此错误也会以另一种形式出现)。

我不知道为什么会这样。我究竟做错了什么?如何解决这个问题?

4

2 回答 2

5

循环中的变量类型for-each应该与您正在迭代的集合中存储的元素类型协变。

hm.get(1)会让你List<Integer>映射到 key 1。迭代它List<Integer>会给你一个Integer,而你试图将它存储在一个List<Integer>. for-each变量应该是而Integer不是List<Integer>。更好的是int,因为Integer无论如何都会被拆箱到int.

话虽如此,根本不需要那个循环。只需以下代码即可:

hm.get(1).removeAll(Collections.singleton(2));

此外,您的代码中还有一些其他重要问题。例如:

  1. 你正在做的方式put()

    hm.put((Integer) 1, new ArrayList<Integer>()); 
    

    最好写成:

    hm.put(1, new ArrayList<Integer>());
    

    1将自动装箱到Integer包装器。你不必担心这一点。

  2. 此外,当您链接方法调用时,不需要用括号括住每个方法调用。所以,

    (hm.get(1)).add(2); 
    

    最好写成:

    hm.get(1).add(2);
    
  3. 第三,最好将您的地图声明为:

    Map<Integer, List<Integer>> hm = new HashMap<Integer, List<Integer>>();
    

    它只是为您提供在地图中添加一个LinkedList或一个ArrayList或任何其他实现的灵活性。

于 2013-10-06T13:15:32.010 回答
3

您正在尝试迭代您的List<Integer>而不是直接使用它。跳过for循环,然后做

hm.get(1).removeAll(Collections.singleton(2));
于 2013-10-06T13:15:12.010 回答