首页 文章

For循环中的迭代器删除了不是Evens的赔率

提问于
浏览
-3

我写这个是为了从ArrayList中删除所有偶数,但它出乎意料地反过来并消除了几率 .

Code:

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);
    }

顺便说一句,“arr”是预先填充到1000的ArrayList . 我很感激这方面的一些帮助,所以我可以弄清楚我做错了什么 .

3 回答

  • 1

    您正在通过调用跳过第一项

    iter.next()
    

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

  • 1

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

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

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

    或者,在Java 8中更简单:

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

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

  • 0

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

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

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

相关问题