迭代HashMap中的ArrayList时出错

Tar*_*rma 1 java arraylist

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

根据其中,我认为,我的代码很好(即使在应用强制转换后,此错误也会以另一种形式显示).

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

Roh*_*ain 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));
Run Code Online (Sandbox Code Playgroud)

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

  1. 你的方式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包装.你不必担心这一点.

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

    (hm.get(1)).add(2); 
    
    Run Code Online (Sandbox Code Playgroud)

    写得更好:

    hm.get(1).add(2);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 第三,最好将地图声明为:

    Map<Integer, List<Integer>> hm = new HashMap<Integer, List<Integer>>();
    
    Run Code Online (Sandbox Code Playgroud)

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