从ArrayList中删除奇数元素

3
public static List<Integer> removeOddNumbers(ArrayList<Integer> list) {
        if (list.isEmpty()) { throw new Error(); }
        List<Integer> toRemove = new ArrayList<>();

        for (int i : list) {
            if (i % 2 != 0) { toRemove.add(i); }
        }
        list.removeAll(toRemove);
        return list;
}

我想从一个ArrayList中删除所有奇数元素,然后返回该ArrayList。

在第一行代码中,我遇到了指向List Integer的错误。

测试:

ArrayList<Integer> arrayList = new ArrayList<Integer>();
Collections.addAll(arrayList, 3, 5, 6, 24, 7, 9, 1, 8, 28, 11);
ArrayList<Integer> result = removeOddNumbers(arrayList);
System.out.println(result);

结果:

[6, 24, 8, 28]

你遇到了什么错误? - sarkasronie
1
你可以使用另一个列表来存储你想要保留的元素或者反向迭代。 - assylias
请问您能否添加调用 removeOddNumbers 的代码? - sarkasronie
1
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为,一个具体的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小、完整和可验证的示例。 - Turing85
4个回答

4
您应该使用迭代器从列表中删除项目。这将节省您使用临时列表存储奇数元素的用途。
public static List<Integer> removeOddNumbers(List<Integer> arrayList) {
    Iterator<Integer> itr = arrayList .iterator();
    while (itr.hasNext())
    {
        int x = (Integer)itr.next();
        if (x % 2 != 0) {
            itr.remove();
        }
    } 
    return arrayList;
}

或者

你可以使用Java8来编写更加简单的代码。


2
如果您正在使用Java 8,您可以直接使用 Collection::removeIf
list.removeIf(i -> i % 2 != 0);

完整的方法应该长这样:
public static List<Integer> removeOddNumbers(List<Integer> list) {
    list.removeIf(i -> i % 2 != 0);
    return list;
}

Example

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 6, 5, 4));
list.removeIf(i -> i % 2 != 0);
System.out.println(removeOddNumbers(list));

Outputs

[2, 6, 4]

我认为他还有另一个问题。代码应该主要工作 - 即使这不是最简单的方法。 - sarkasronie
1
@qwert123,请使用List<Integer>代替ArrayList<Integer>,请查看我的修改。 - Youcef LAIDANI
你是什么意思,@sarkasronie? - Youcef LAIDANI
如果你给了他一个关于问题的提示,那么你将得到我的一分。因为他的问题并不是去除奇数算法。 - sarkasronie
@sarkasronie,原帖似乎是使用 List<Integer> list 调用了他的方法,而 List<Integer> 无法转换为 ArrayList<Integer> - Youcef LAIDANI
显示剩余4条评论

1
Lambda方式:

public static List<Integer> filter(List<Integer> numberList) {
    return numberList.stream()
        .filter(number -> number % 2 != 0)
        .collect(Collectors.toList());
}

你应该用这个方法调用它:

List<Integer> list = Arrays.asList(3, 5, 6, 24, 7, 9, 1, 8, 28, 11);
List<Integer> result = removeOddNumbers(numbers);
System.out.println(result);

问题在于该方法的返回类型是 List<Integer>,但您的代码期望的是一个 ArrayList。解决方案是简单地使用通用类 List,或者如果您想使用您的代码,应该像这样编写:
ArrayList<Integer> arrayList = new ArrayList<Integer>();
Collections.addAll(arrayList, 3, 5, 6, 24, 7, 9, 1, 8, 28, 11);
List<Integer> result = removeOddNumbers(arrayList);
System.out.println(result);

注意:@YCF_L发布的方法会修改您通过参数传递的列表,而我的方法则创建一个新的列表,不会改变原始列表。


确实。在 List <Integer> 上也遇到了“找不到符号”错误。 - qwert123
@qwert123 发布完整的类,这很可能是语法错误。 - Emax
未给出一个类,但是发布了测试。 - qwert123
@qwert123 已修复 - Emax

0
// you can use Iterator.remove()
List arr = new ArrayList();
        arr .add(10);
        arr .add(20);
        arr .add(30);
        arr .add(1);
        arr .add(2);

        // Remove odd elements
        // Iterator.remove()
        Iterator itr = arr .iterator();
        while (itr.hasNext())
        {
            int x = (Integer)itr.next();
            if (x % 2 != 0)
                itr.remove();
        } 
        System.out.println("Modified ArrayList : "                                     + arr);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接