【问题标题】:Java ArrayList -- What's going on here [duplicate]Java ArrayList——这里发生了什么[重复]
【发布时间】:2018-04-02 15:55:17
【问题描述】:

Java 新手,在网上看到了这个例子。函数 removeZeros 应该删除 ArrayList 中为零的所有整数,但由于某种原因,如果它们是连续的,它不会删除它们。我对此感到非常困惑,因为我不明白为什么它没有严格删除数组中所有出现的 0 。原因可能很明显,但我就是看不到...

public static void main(String args[]) 
{
    List<Integer> a = new ArrayList<Integer>();
    a.add(0);
    a.add(0);
    a.add(4);

    System.out.println(a);  // prints [0 , 0 , 4]
    removeZeros(a);
    System.out.println(a);  // prints [0 , 4] ??   why not just [4]?
}

// function to remove all zeros from an integer list
public static void removeZeros(List<Integer> nums) 
{
  for (int i = 0; i < nums.size(); i++)
    if (nums.get(i) == 0)
        nums.remove(i);
}

感谢任何见解。

【问题讨论】:

  • for循环应该反向迭代。
  • 当你遍历一个 List 时,你应该以相反的顺序进行
  • "在网上看到了这个例子" 建议你找更好的例子来学习。
  • @AndyTurner 这是我在网上找到的计算机科学考试题。抱歉,我猜“示例”是一个误导性词:0
  • @alfasin 该副本不相关。

标签: java arraylist


【解决方案1】:

第一次迭代,index 为 0,nums 有:

-> 0
0
4

第一个0 已被删除!

第二次迭代,index 为 1,nums 有:

0
-> 4

由于4!=0,不会删除任何内容,因此您只剩下[0, 4]

【讨论】:

    【解决方案2】:

    说明

    这仅仅是因为您的 index-logic 不正确。

    我们来看下面的例子:

    [1, 0, 0, 4, 5, 0]
    

    我们在索引125 上有。您的代码开始迭代,索引0 很好。现在i = 1,我们将使用list.remove(i) 将其从列表中删除。该列表现在看起来像:

    [1, 0, 4, 5, 0]
    

    现在请注意,索引已更改!剩余的零现在位于索引14 而不是25。但是您的循环前进i,您检查的下一个元素将是i = 2,因此您错过了1 位置的零。

    所以问题在于元素的移除会影响循环的索引逻辑


    解决方案

    一个简单的解决方法是反向执行该过程:

    for (int i = nums.size() - 1; i >= 0; i--) {
        if (nums.get(i) == 0) {
            nums.remove(i);
        }
    }
    

    因为如果大小减小,它不会影响较低的索引。

    或者,如果您删除某些内容,请不要前进i

    int i = 0;
    while (i < nums.size()) {
        if (nums.get(i) == 0) {
            nums.remove(i);
        } else {
            i++;
        }
    }
    

    【讨论】:

      【解决方案3】:

      这是因为一旦你删除了第一个零,数组现在看起来像:

      [0, 4]
      

      然后我们移动到索引 1,它被设置为 4,所以它没有被删除。

      正如用户@Andy Turner 所说,您应该以相反的顺序迭代数组

      【讨论】:

      • 或使用list.removeIf(x -&gt; x == 0);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2021-08-04
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 2010-12-14
      相关资源
      最近更新 更多