【问题标题】:Are for-loops conditions able to be changed midloop?for 循环条件是否可以在循环中更改?
【发布时间】:2014-10-15 01:56:50
【问题描述】:

在java编程中: 我有一些类似的东西

ArrayList<String> list = new ArrayList<String>();

int listSize = list.size();

for(int x = 0; x< listSize; x++){
    list.remove(x);
    listSize = list.size();
}

这是否足够好?还是 for 循环会继续运行。谢谢!

【问题讨论】:

  • 不,您不能更改条件本身,但您可以调用break; 来停止执行循环。或者,您可以将 listSize 更改为其他内容以减少执行时间,但这是不好的做法。
  • @Kon 这是一个答案,而不是评论。做到这一点并获得赞成/接受

标签: java for-loop arraylist


【解决方案1】:

我有点担心你在这里尝试做什么。任何时候有人想在不使用Iterator 的情况下循环从集合中删除项目时,警报通常会响起。

所以,回答问题如上所述:如果你改变你的循环不变量,那么你会得到一些时髦的行为。这就是为什么它通常被称为“不变量”的原因;你不想想要改变它。当然欢迎你,但你在这里玩火。

但是,假设我们有一个包含 5 个元素的列表,并且我们按原样执行您的代码。

List<String> stringList = Arrays.asList("word", "another word", "let's go", "keep it up", "get moving");

int length = stringList.size();

for(int i = 0; i < length; i++) {
    System.out.println(stringList.remove(i));
    length = stringList.size();
}

System.out.println("done");

如果您希望它打印出列表中的每个单词,请再考虑一下。它将跳过每个元素,因为我们在迭代列表时正在更改列表的内容。从 ArrayList 中删除元素时,底层实现会将元素移到删除它的左侧。因此,如果从位置 0 删除,每个元素现在都位于其原始位置的左侧(因此元素 1 现在是元素 0)。

快速浏览:

  • 第一次迭代,i = 0"word" 被删除。大小更改为 4,i 增加为 1。
  • 第二次迭代,i = 1"let's go" 被删除。大小更改为 3,i 增加为 2。
  • 第三次迭代,i = 2"get moving" 被删除。 SIze 变为 2,i 变为 3。
  • 由于条件不满足,不再进行迭代。

如果您想从集合中干净地删除 所有 将它们打印出来,那么 ArrayList#clear() 就是您要寻找的。如果您想一次删除一个元素,请改用Iterator

List<String> stringList = new ArrayList<>(Arrays.asList("word", "another word", "let's go", "keep it up", "get moving"));

for(Iterator<String> stringIterator = stringList.iterator(); stringIterator.hasNext(); ) {
    System.out.println(stringIterator.next());
    stringIterator.remove();
}

System.out.println("done");

【讨论】:

  • 我的程序的真正目标是我必须将列表中的项目相互比较,以便将它们组合在一起进行打印。这只是我对如何做到这一点的第一个想法。 (我也对 for 循环条件部分感到好奇)
【解决方案2】:

循环不会继续运行,它将毫无例外地结束。但结果可能不是你所期望的。 除了“ArrayList#clear()”或迭代器方式从一个数组中删除所有元素。您也可以尝试以下代码,只需从循环条件中删除“x++”即可。

ArrayList<String> list = new ArrayList<String>();

int listSize = list.size();

for(int x = 0; x< listSize;){
  list.remove(x);
  listSize = list.size();
}

【讨论】:

    【解决方案3】:

    为什么不在“while”循环中做呢?

    ArrayList<String> list = new ArrayList<String>();
    
    int listSize = list.size();
    
    while(list.size() != 0){
        list.remove(x);
    }
    

    【讨论】:

      【解决方案4】:

      从技术上讲,计算机科学课程可能会告诉你这样做:

      public void solve() {
          ArrayList<String> list = new ArrayList<String>();
          Iterator iter = list.iterator();
          while(iter.hasNext()) {
              System.out.println("Next value is: " + iter.next());
              iter.remove();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-21
        • 2016-01-28
        • 1970-01-01
        • 2020-03-01
        • 2011-09-28
        • 2018-08-10
        • 2013-08-14
        相关资源
        最近更新 更多