for循环中的迭代器删除了不是偶然的赔率

时间:2017-09-08 20:57:40

标签: java arraylist

我写这篇文章是为了从ArrayList中删除所有偶数,但它出乎意料地反而删除了几率。

代码:

ArrayList arr = new ArrayList<Integer>(); //filled 1-1000

protected void eliminateEven()
    {
        x = 0;
        for(Iterator<String> iter = arr.iterator(); iter.hasNext(); )
        {
            iter.next();

            if(x % 2 == 0)
            {
                iter.remove();
            }
            x++;
        }

        System.out.println(arr);
    }

顺便说一下,&#34; arr&#34;是一个预先填充到1000的ArrayList。我很感激一些帮助,所以我可以弄清楚我做错了什么。

3 个答案:

答案 0 :(得分:1)

您似乎有一个Integer列表和一个String的迭代器。这没有多大意义。但假设它们是字符串,则需要在检查它们是否为偶数之前转换为整数。

您不需要维护x索引:只需检查迭代器的值:

if (Integer.valueOf(iter.next()) % 2 == 0)
    iter.remove();

或者,在Java 8中更简单:

arr.removeIf(i -> Integer.valueOf(i) % 2 == 0);

顺便说一句,我建议while循环比没有for子句的next循环更清晰:

答案 1 :(得分:1)

您正在通过调用

跳过第一项
iter.next()

在实际检查条件之前,那么你的迭代器实际上是一个'位置',而不是你的'索引',这就是为什么它会删除奇数元素而不是你想要的偶数。

答案 2 :(得分:0)

使用简单的外部循环,它将是这样的:

Iterator<String> iter = arr.iterator();
int x = 1;
while (iter.hasNext()) {
    iter.next();
    if(x % 2 == 0) {
        iter.remove();
    }
    x++;
}

当然,还有更优雅的解决方案。