【问题标题】:Passing ArrayList to TreeSet constructor将 ArrayList 传递给 TreeSet 构造函数
【发布时间】:2018-03-11 07:37:33
【问题描述】:

当我将 ArrayList 传递给 TreeSet 构造函数时,我收到以下错误:

Exception in thread "main" java.lang.ClassCastException: [I cannot be cast to java.lang.Comparable
    at java.util.TreeMap.compare(TreeMap.java:1294)
    at java.util.TreeMap.put(TreeMap.java:538)
    at java.util.TreeSet.add(TreeSet.java:255)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
    at java.util.TreeSet.addAll(TreeSet.java:312)
    at java.util.TreeSet.<init>(TreeSet.java:160)
    at jay.week1.MaxPairwiseProduct.getMaxPairwiseProduct(MaxPairwiseProduct.java:8)
    at jay.week1.MaxPairwiseProduct.main(MaxPairwiseProduct.java:17)

我在这一行收到上述错误:

TreeSet<Integer> set = new TreeSet(Arrays.asList(numbers));

这是完整的程序:

import java.util.*;


public class MaxPairwiseProduct {
static int getMaxPairwiseProduct(int[] numbers) {
    TreeSet<Integer> set = new TreeSet(Arrays.asList(numbers));
    int max1 = set.pollLast();
    int max2 = set.pollLast();
    int result = max1 * max2;
    return result;
}

public static void main(String[] args) {
    int[] numbers = {1, 2, 3};
    System.out.println(getMaxPairwiseProduct(numbers));
}

}

我做错了什么?

【问题讨论】:

  • 请包含实际的失败代码。
  • TreeSet set = new TreeSet(Arrays.asList(numbers));
  • int[] number 更改为Integer [] number
  • Arrays.asList 的整数数组不会自动将基元装箱为整数对象...您最好使用循环创建整数对象列表并将 Treeset 实现更改为 @987654326 @
  • 您在new TreeSet&lt;&gt;(...) 中缺少通用运算符,并且您会收到关于它的编译器警告。加上它,它可能能够推断出需要什么

标签: java treeset


【解决方案1】:

Arrays.asList() 实际返回的是 int 数组列表。

List<int[]> list = Arrays.asList(numbers);

您需要执行以下操作。

TreeSet<Integer> set = Arrays.stream(number).boxed()
.collect(Collectors.toCollection(TreeSet::new));

【讨论】:

    【解决方案2】:

    因为你不能有TreeSet&lt;int&gt;,只有TreeSet&lt;Integer&gt;

    因为您没有为TreeSet 指定泛型类型,所以Arrays.asList 尝试创建List&lt;int[]&gt;,它成功了。为什么是int[]?你可能会问。这是因为int不能是泛型类型,所以asList的泛型参数推断为int[],可以是泛型类型。但随后这个列表进入TreeSet的构造函数,TreeSet发现这不是Integers的列表,抛出异常。

    要解决此问题,您可以将参数类型从int[] 更改为Integer[],或将int[] 转换为Integer[],然后再将其传递给Arrays.asList

    TreeSet<Integer> set = new TreeSet<>(Arrays.stream(numbers).boxed().collect(Collectors.toList()));
    

    【讨论】:

    • 这一切都是正确的,但并不能真正解释原始TreeSet 的推断类型是TreeSet&lt;int[]&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2011-09-24
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多