【问题标题】:Incompatible types error when put ArrayList as value to a map将 ArrayList 作为值放入地图时出现不兼容的类型错误
【发布时间】:2020-03-28 07:59:08
【问题描述】:

如果列表已存在,我将获取该列表并向其添加元素。

代码 sn-p:

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

错误详情:

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

如何解决这个问题?

【问题讨论】:

  • 你打算map.put(factor, map.getOrDefault(factor, new ArrayList&lt;&gt;())).add(num) 吗? (右括号不匹配)
  • 没有括号不匹配我只是获取列表(如果已经存在)或创建一个新列表
  • "不兼容的类型:boolean 无法转换为 List" ... 因为 .add 返回一个 boolean 值,并且您已将其作为值包含在 @ 987654325@ 操作,其中需要 List 作为值。

标签: java arraylist collections compiler-errors maps


【解决方案1】:

因为add() 具有boolean 作为返回类型。您不能将布尔值放入以 List&lt;Integer&gt; 为值的映射。

你需要创建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)));

【讨论】:

    【解决方案2】:

    即使之前的 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-19
      • 2013-10-29
      • 2016-01-18
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多