迭代HashMap中的ArrayList时出错

时间:2013-10-06 13:12:37

标签: java arraylist

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

据我所知,我的代码很好(即使在使用强制转换后,此错误也会以其他形式显示)。

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

2 个答案:

答案 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));

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

  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>>();
    

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

答案 1 :(得分:3)

您正试图遍历List<Integer>,而不是直接使用它。跳过for循环,然后执行

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