【问题标题】:What will happen if the conditon in the for loop is continuously changed?如果for循环中的条件不断变化会发生什么?
【发布时间】:2018-01-03 11:29:05
【问题描述】:

以下代码块的结果是什么?

 ArrayList<Integer> myList = new ArrayList<Integer>();
   for (int i = 0; i < myList.size(); i++) {
   myList.remove(i);
    }

提供了答案,因为循环永远不会运行。

但是对于 [-1, 3, 28, 17, 9, 33] 的输入, 我得到 [3, 17, 33] 作为输出。什么意思?

【问题讨论】:

  • 在每次迭代时都会评估条件子句,因此每次都会调用myList.size()。只有 init 子句被调用一次。仅供参考:for(init;condition;iteration)。在您的逻辑中,您将删除第一个、第三个、第五个(奇数索引)、...元素,因为下一个元素将向左移动。如果要删除所有项目,只需从列表末尾开始,从右到左删除项目即可。

标签: java for-loop arraylist


【解决方案1】:

每次迭代都会评估条件。 列表开头包含 [-1、3、28、17、9、33] 循环开始:

  • i = 0; 0 -1, 3, 28, 17, 9, 33],删除了索引为 0(粗体)的元素,剩余 [3, 28, 17, 9, 33 ]
  • i = 1; 1 28, 17, 9, 33],删除了索引为 1(粗体)的元素,剩余 [3, 17, 9, 33]
  • i = 2; 2 9, 33],删除了索引为 2(粗体)的元素,剩余 [3, 17, 33]
  • i = 3; 3

【讨论】:

    【解决方案2】:

    错误!只要条件仍然满足,循环就会运行。每次迭代都会产生一个新的场景,并且条件会随着新值的变化而变化。

    使用您的示例 [-1, 3, 28, 17, 9, 33]:

    • 第一次迭代: i 为 0...0 小于 6.. 索引 0 (-1) 处的元素因此被删除

      结果数组列表:[3, 28, 17, 9, 33]

    • 第二次迭代: i 是 1... 1 小于 5.. 索引 1 (28) 处的元素因此被删除

      结果数组列表:[3, 17, 9, 33]

    • 第三次迭代: i 是 2...2 小于 4.. 索引 2 (9) 处的元素因此被删除

      结果数组列表:[3, 17, 33]

    • 第四次迭代: i 为 3... 3 小于 3.. 迭代停止。

    循环操作后,你的 MyList arraylist 将被缩减为:

    [3, 17, 33]
    

    我希望这会有所帮助,编码愉快!

    【讨论】:

      猜你喜欢
      • 2020-12-04
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多