【问题标题】:When removing multiple items from an ArrayList, why is is better to use a while loop instead of a decrementing for loop?从 ArrayList 中删除多个项目时,为什么使用 while 循环而不是递减 for 循环更好?
【发布时间】:2016-09-27 20:49:04
【问题描述】:

我现在正在阅读几本编程书籍并上在线课程(所以没有老师可以问),我在每一本书中都看到了相同的内容。在每一篇文章中都说,当您从 Java 中的 ArrayList 中删除多个项目时,您不应使用 for 循环,而应使用 while 循环。我明白你为什么不使用

for (int i = 0; i < arylst.size(); i++) {...}

但是当我尝试这样做时

for (int i = arylst.size() - 1; i >= 0; i--) {...}

它似乎工作正常。在某些情况下这会导致问题吗?为什么这不是正确的做法?

【问题讨论】:

  • 我在 4 个地方看到过这种情况,但都没有解决递减 for 循环的想法。他们只是说不要使用 for 循环,正确的方法是使用 while 循环。
  • 更多的上下文真的会帮助这个问题:)
  • 似乎是个荒谬的建议。哪方面更好?书,页?

标签: java for-loop arraylist


【解决方案1】:

如果您使用for-each 循环从ListArrayList 中删除元素,您将面临java.util.ConcurrentModificationException。您需要使用java.util.Iterator

这是一个例子:-

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> list= new ArrayList<Integer>();
        for(int i=1; i<=10; i++){
            list.add(i);
        }
        System.out.println("list (before) = "+list);

        // removing the even elements
        System.out.println("even numbers have been removed");
        Iterator<Integer> iterator =list.iterator();
        while(iterator.hasNext()){
            Integer num= iterator.next();
            if(num%2==0){
                iterator.remove();
            }
        }       
        System.out.println("list (after) = "+list);     
    }

}

请查看此链接:http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html

据说:

请注意,Iterator.remove 是修改集合的唯一安全方法 在迭代期间;如果底层的行为是未指定的 在迭代中以任何其他方式修改集合 进展。

使用for each 循环的示例

public static void main(String[] args) {
    List<Integer> list= new ArrayList<>();
    for(int i=1; i<=10; i++){
        list.add(i);
    }
    System.out.println("list (before) = "+list);

    // removing the even elements
    System.out.println("even numbers have been removed");

    for(Iterator<Integer> iterator = list.iterator(); iterator.hasNext(); ){
        Integer num = iterator.next();
        if(num%2==0){
            iterator.remove();
        }
    }       
    System.out.println("list (after) = "+list);     
}

【讨论】:

  • @MakPo 我可以知道为什么这个答案不能解决您面临的问题吗?
  • 我不是反对它的人。这可能是正确的,但我真的不明白迭代器是什么或ConcurrentModificationException。我现在正在查看 Java 文档。
  • @MakPo 你能看看我的答案的补充吗?
  • 我将添加这一点,无论您使用的是哪种类型的循环(forwhile 在迭代列表时修改列表最安全的方法是使用和iterator。所以可以使用带有iteratorfor 循环
  • @MakPo 我建议您在迭代列表时需要修改列表时始终使用iterator
【解决方案2】:

递减 for 循环并没有错。

它唯一可以并且通常确实导致的问题是错误,因为写入时缺少符号。这不是 for 循环的 90% 用例,所以它可能对每个人来说都不是那么直观,因此更容易导致错误。 这就是为什么在教学书籍中首选 while 循环的原因。

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 2021-05-21
    • 2011-10-06
    • 2013-06-28
    • 2014-11-13
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    相关资源
    最近更新 更多