数组的 Arrays.asList()

2022-09-01 03:42:40

此转换有什么问题?

public int getTheNumber(int[] factors) {
    ArrayList<Integer> f = new ArrayList(Arrays.asList(factors));  
    Collections.sort(f);
    return f.get(0)*f.get(f.size()-1);
}

我在阅读了从数组创建数组列表中找到的解决方案后才这样做。中的第二行(排序)会导致以下异常:getTheNumber(...)

线程“main” java.lang.ClassCastException中的异常:[我不能被强制转换为java.lang.Comparable]

这是怎么回事?我确实意识到排序可以用来完成,我只是对这个很好奇。Arrays.sort()


答案 1

让我们考虑以下简化示例:

public class Example {
    public static void main(String[] args) {
        int[] factors = {1, 2, 3};
        ArrayList<Integer> f = new ArrayList(Arrays.asList(factors));
        System.out.println(f);
    }
}

在println行,它打印类似“[[I@190d11]”的东西,这意味着你实际上已经构造了一个包含int数组的ArrayList

IDE 和编译器应警告该代码中未选中的赋值。应始终使用 或 代替 。如果您使用了它,则会因为尝试传递给构造函数而出现编译错误。new ArrayList<Integer>()new ArrayList<>()new ArrayList()List<int[]>

没有从 到 的自动装箱,无论如何,自动装箱只是编译器中的语法糖,所以在这种情况下,你需要手动执行数组复制:int[]Integer[]

public static int getTheNumber(int[] factors) {
    List<Integer> f = new ArrayList<Integer>();
    for (int factor : factors) {
        f.add(factor); // after autoboxing the same as: f.add(Integer.valueOf(factor));
    }
    Collections.sort(f);
    return f.get(0) * f.get(f.size() - 1);
}

答案 2

您正在尝试将 int[] 转换为 Integer[],这是不可能的。

您可以使用 commons-lang 的 ArrayUtils 将 ints 转换为 Integers,然后再从数组中获取 List:

public int getTheNumber(int[] factors) {
    Integer[] integers = ArrayUtils.toObject(factors);
    ArrayList<Integer> f = new ArrayList<Integer>(Arrays.asList(integers));
    Collections.sort(f);
    return f.get(0)*f.get(f.size()-1);
}