将ArrayList传递给TreeSet构造函数

时间:2018-03-11 07:37:34

标签: java treeset

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

library(dplyr)
library(tidyr)
dat %>%
    mutate(x = factor(x, levels = unique(z))) %>%
    count(x, y) %>% 
    na.omit %>%
    spread(y, n, fill = 0, drop = FALSE) %>%
    select(-x)
# A tibble: 5 x 3
#   `21`  `22`  `23`
#* <dbl> <dbl> <dbl>
#1  2.00  0     1.00
#2  0     1.00  0   
#3  0     0     0   
#4  1.00  0     0   
#5  0     0     0   

我在这一行得到了上述错误:

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));

我做错了什么?

2 个答案:

答案 0 :(得分:1)

没有这样做是因为你不能拥有try (Resources resources = new Resources()) { .... } catch (Exception e) { .... } ,只有TreeSet<int>

由于您没有为TreeSet<Integer>指定通用类型,TreeSet会尝试创建Arrays.asList,但它会成功。为何选择List<int[]>?你可能会问。这是因为int[]不能是泛型类型,因此int的泛型参数推断为asList,它可以是泛型类型。但是,此列表会进入int[]的构造函数,TreeSet会发现这不是TreeSet的列表,会抛出异常。

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

Arrays.asList

答案 1 :(得分:1)

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

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

您需要执行以下操作。

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