数组的Arrays.asList()

nbl*_*nbl 38 java arrays integer arraylist

这次转换有什么问题?

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);
}
Run Code Online (Sandbox Code Playgroud)

我在从数组中读取Create ArrayList中找到的解决方案之后做了这个.第二行(排序)getTheNumber(...)导致以下异常:

线程"main"中的异常java.lang.ClassCastException:[我无法转换为java.lang.Comparable]

这有什么不对?我确实意识到排序可以完成Arrays.sort(),我只是好奇这个.

Esk*_*ola 42

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在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);
}
Run Code Online (Sandbox Code Playgroud)

  • 来自IDE的非常好的截图.这是一个很好的.荣誉. (2认同)

Ric*_*ler 9

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

在从数组中获取List之前,您可以使用commons-lang的ArrayUtils将整数转换为整数:

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);
}    
Run Code Online (Sandbox Code Playgroud)


dfa*_*dfa 8

这个例外有两个原因:

1

Arrays.asList(factors)返回List<int[]>,其中factors是一个int数组

2

你忘了将type参数添加到:

ArrayList<Integer> f = new ArrayList(Arrays.asList(factors));
Run Code Online (Sandbox Code Playgroud)

有:

ArrayList<Integer> f = new ArrayList<Integer>(Arrays.asList(factors));  
Run Code Online (Sandbox Code Playgroud)

导致编译时错误:

found   : java.util.List<int[]>
required: java.util.List<java.lang.Integer>


Tom*_*Tom 6

使用java.utils.Arrays:

public int getTheNumber(int[] factors) {
    int[] f = (int[])factors.clone();
    Arrays.sort(f);
    return f[0]*f[(f.length-1];
}
Run Code Online (Sandbox Code Playgroud)

或者如果你想要高效避免所有的对象分配只是实际上做的工作:

public static int getTheNumber(int[] array) {
    if (array.length == 0)
        throw new IllegalArgumentException();
    int min = array[0];
    int max = array[0];
    for (int i = 1; i< array.length;++i) {
        int v = array[i];
        if (v < min) {
            min = v;
        } else if (v > max) {
            max = v;
        }
    }
    return min * max;
}
Run Code Online (Sandbox Code Playgroud)