我在ArrayList上做初学者Java教程,要求我做下面的
// Create a method called removeOdd
// Remove all the odd numbers from an ArrayList
// removeOdd(Arrays.asList(1,2,3,5,8,13,21)) => {2, 8}
// removeOdd(Arrays.asList(7,34,2,3,4,62,3)) => {34, 2, 4, 62}
以下是我的代码
import java.util.ArrayList;
import java.util.Arrays;
public class Ex4_RemoveOdd {
public static void main(String[] args) {
removeOdd((ArrayList<Integer>) Arrays.asList(1,2,3,5,8,13,21));
removeOdd((ArrayList<Integer>) Arrays.asList(7,34,2,3,4,62,3));
}
public static void removeOdd(ArrayList<Integer> list){
for (int i = 0; i < list.size(); i++){
int num = list.get(i);
if (num % 2 != 0){
list.remove(i);
}
}
System.out.println(list);
}
}
代码运行,但是给出了以下错误代码
Exception in thread "main" java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
有谁知道我做错了什么?
我知道SO上还有另一个similar question
但是我认为我们的情况有所不同,因为OP没有像我那样使用AsList在方法中声明一个列表。
非常感谢您的时间:)
答案 0 :(得分:3)
方法Arrays.asList
returns a List
,但它不是java.util.ArrayList
。它是嵌套在private
内的ArrayList
嵌套类Arrays
,并且它有所不同。它不支持添加或删除生成的列表。
要制作实际的java.util.ArrayList
,请将List
传递给合适的ArrayList
constructor,其中需要Collection
,例如
removeOdd(new ArrayList<Integer>(Arrays.asList(1, 2, 3, 5, 8, 13, 21)));
至于为什么内部类被称为java.util.Arrays$ArrayList
,这是因为美元符号$
将封闭的类名与嵌套的类名分开。
答案 1 :(得分:1)
有谁知道我做错了什么?
有两个名为ArrayList
的类,一个可以直接使用,另一个则不应该使用。你不能仅仅因为它们具有相同的名称而将其中一个投射到另一个。
幸运的是,您不需要首先执行此操作,因为您不需要指定需要ArrayList。您可以编写它,以便可以传递任何可变列表。 BTW Arras.aslIst是固定长度,所以你不能在这里使用它。
相反,我建议不要改变你的清单,而是打印结果。
printEven(Arrays.asList(1,2,3,5,8,13,21));
printEven(Arrays.asList(7,34,2,3,4,62,3));
public static void removeOdd(Iterable<Integer> list) {
List<Integer> even = new ArrayList<>();
for (integer i: list) if (i %2 == ) even.add(i);
System.out.println(even);
}
答案 2 :(得分:0)
问题在于:
removeOdd((ArrayList<Integer>) Arrays.asList(1,2,3,5,8,13,21));
ArrayList
与List
返回的Arrays#asList
相同,而堆栈跟踪告诉您:
线程“main”中的异常java.lang.ClassCastException:java.util.Arrays $ ArrayList 无法强制转换为 java.util.ArrayList
创建一个新的ArrayList
并传递List
作为参数返回的Arrays#asList
:
removeOdd(new ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21)));