当前位置: 首页 > 知识库问答 >
问题:

从数组列表中删除奇数值的方法Java

仲智
2023-03-14
List<Integer> listArr = new ArrayList<>();

        listArr.add(5);
        listArr.add(7);
        listArr.add(90);
        listArr.add(11);
        listArr.add(55);
        listArr.add(60);
for(int i = 0; i < listArr.size(); i++) {
            if (listArr.get(i) % 2 != 0) {
                listArr.remove(i);
            }
        }

我试图从ArrayList中删除所有奇数,并且它必须是for或Fore每循环。循环结束后,ArrayList中剩余的数字的结果将7, 90, 55, 60。当我设定一个条件时:

if(listArr.get(i) % 2 == 0)

一切工作正常。所有偶数都被删除,但在第一个示例中,奇数的情况并非如此。为什么会发生这种情况?

共有3个答案

汪博达
2023-03-14

答案只是一行简单的代码,事实上,您可以使用流api的许多方法来实现它,这里我们使用收集器接口。

public class Main {
    public static void main(String[] args) {
    
        //question values
        List<Integer> list = new ArrayList<>();
        list.add(5);
        list.add(7);
        list.add(90);
        list.add(11);
        list.add(55);
        list.add(60);
        
        //answer
        List<Integer> result = list.stream().collect(ArrayList::new, (u, v) -> {if(v % 2 == 0)           u.add(v);}, List::addAll);
        
        //validating result
        result.forEach(System.out::println);
    }
}

此外,您还可以通过创建如下自定义收集器获得相同的结果

public class OddNumbersCollector implements Collector<Integer, List<Integer>, List<Integer>> {
    @Override
    public Supplier<List<Integer>> supplier() {
        return ArrayList::new;
    }

    @Override
    public BiConsumer<List<Integer>, Integer> accumulator() {
        return (u, v) -> {
            if(v % 2 == 0)
                u.add(v);
        };
    }

    @Override
    public BinaryOperator<List<Integer>> combiner() {
        return (u, v) -> {
            u.addAll(v);
            return u;
        };
    }

    @Override
    public Function<List<Integer>, List<Integer>> finisher() {
        return Function.identity();
    }

    @Override
    public Set<Characteristics> characteristics() {
        return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH, Characteristics.CONCURRENT));
    }
}

这个案例的答案是

List<Integer> result = list.stream().collect(new OddNumbersCollector());

就这些,不需要额外的努力。

慕和惬
2023-03-14

您不应该使用for循环(添加和删除)编辑列表,而应该使用迭代器,如:

java prettyprint-override">        List<Integer> listArr = new ArrayList<>();

        listArr.add(5);
        listArr.add(7);
        listArr.add(90);
        listArr.add(11);
        listArr.add(55);
        listArr.add(60);
        var it = listArr.iterator();
        while (it.hasNext()) {
            var n = it.next();
            if (n % 2 == 0) {
                it.remove();
            }
        }
田鹤轩
2023-03-14

因为当你删除数组列表中的一个项时,你已经改变了列表,试着以反向模式迭代它。分解:

  1. 当i=0时,代码将其从列表中删除,则列表中的索引0为7
  2. 当i=1时,1上的索引是90,所以你的代码不会删除它。
  3. 当i=2时,2上的索引是11,所以你的代码删除了它,然后列表中2上的索引是55,
  4. 当i=3时,索引在3 i 60上,因此它将被保留。

循环结束时,这就是为什么您的代码输出您看到的内容,这就是为什么您应该以反向模式运行它

 类似资料:
  • 几个月前我学习了递归,现在这一切都很混乱。有一个人可以解释我整个功能是如何正常工作的,但我有点明白它是如何工作的,但我认为有些步骤在我的脑海中并不是很清楚。病人的Thx提前。

  • 我有一个arraylist的arraylist,每个arraylist都有相同的点,例如,当您打印时,这是输出 在打印之前,我要删除其x值不等于数组列表索引的所有点 所以输出应该是 我尝试使用remove方法和for循环以及其他方法,但都不起作用。 有人能帮忙吗?

  • 问题内容: 我已经开发了像这样的数组列表 现在我的问题是:如果我想从列表中删除“ 8”,哪种方法更好? 第一种方式: 第二种方式: 现在,请从性能的角度建议其中哪一个效率更高,速度更快,并且还有其他任何类似于内置函数的方法,通过使用它,我们可以删除重复项而无需进行过多迭代。 问题答案: 在性能方面,它们应该相似。你测试了吗 如果要使用内置方法,则可以达到类似的性能(通过测试确认): 最后,如果您想

  • 本文向大家介绍JavaScript从数组中删除指定值元素的方法,包括了JavaScript从数组中删除指定值元素的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript从数组中删除指定值元素的方法。分享给大家供大家参考。具体分析如下: 下面的代码使用了两种方式删除数组的元素,第一种定义一个单独的函数,第二种为Array对象定义了一个removeByValue的方法,调用非

  • 我想弄清楚如何从我的数组中删除nan值。我的数组看起来像这样: 如何从中删除值?

  • 目前,我创建了单独的,最后连接这些,以创建一个。 是否有优雅的或一个衬里来从数组列表和多个数组中创建df。