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)
您正在尝试将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)
这个例外有两个原因:
Arrays.asList(factors)返回List<int[]>,其中factors是一个int数组
你忘了将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>
使用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)