将ArrayList作为值映射到映射时出现不兼容的类型错误

时间:2020-03-28 07:59:08

标签: java arraylist collections compiler-errors maps

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

代码段:

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

错误详细信息:

错误:不兼容的类型:布尔值无法转换为列表

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

因为add()具有boolean作为返回类型。您不能将布尔值放在以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)));

答案 1 :(得分:0)

即使重新使用以前的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);
相关问题