将 ArrayList 作为值放入地图时出现不兼容类型错误

Incompatible types error when put ArrayList as value to a map

我正在获取列表(如果它已经存在)并向其中添加一个元素。

代码片段:

Map<Integer, List<Integer>> map = new TreeMap<>(Collections.reverseOrder());
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
    int factor = 0;
    int num = sc.nextInt();
    for (int j = 1; j <= num; j++)
      if (num % j == 0) factor++;  //just getting factor count of each input

    map.put(factor, map.getOrDefault(factor, new ArrayList<>()).add(num)); // error line

错误详情:

error: incompatible types: boolean cannot be converted to List

如何解决这个麻烦?

因为 add()boolean 作为 return 类型。您不能将布尔值放入以 List<Integer> 作为值的地图。

您需要创建 ArrayList -> 先向其中添加一个元素。

然后才把它作为一个值放到地图上:

List<Integer> list = new ArrayList<>();
list.add(num);
map.put(factor, map.getOrDefault(factor, list));

从 Java 9+ 开始,您可以使用 List.of():

map.put(factor, map.getOrDefault(factor, List.of(num)));

你的错误行创建了一个新的 ArrayList<>() 即使之前的 ArrayList 被重新使用所以尝试:

List<Integer> list = map.get(factor);
if (list == null) {
   list = new ArrayList<>();
   map.put(factor, list);
}
list.add(num);

在 java 9 List.of(num) 是不可变的,所以 .add(num) 到现有的会失败,但在 Java 8+ 你可以使用这个更简洁的定义仅在需要时创建新的 ArrayList:

var map = new TreeMap<Integer, List<Integer>>(Collections.reverseOrder());
...
map.computeIfAbsent(factor, ArrayList::new).add(num);