尽管代码删除了“ 0”值,但为什么列表中还剩下“ 0”值?

时间:2019-01-03 19:04:20

标签: java

我正在为计算机科学A考试处理示例题,无法弄清楚为什么对以下问题的正确答案是正确的。

请考虑以下方法。

public static void mystery(List<Integer> nums)
{
    for (int k = 0; k < nums.size(); k++)
    {
         if (nums.get(k).intValue() == 0)
         {
              nums.remove(k);
         }
    }
}

假定List值最初包含以下Integer值。 [0,0,4,2,5,5,0,3,0] 执行神秘值会导致值包含什么?

正确的答案是:[0,4,2,5,3]

为什么前0个仍保留在列表中?

2 个答案:

答案 0 :(得分:3)

第一个0仍然存在,因为那实际上是0中的第二个nums

k0时,测试成功并调用remove(0),删除第一个索引。这样会将所有其他元素下移,因此列表现在为[0, 4, 2, 5, 0, 3, 0]。但是随后k增加到1,因此第二个0(现在位于索引0处)被跳过而不删除。

其他0值被成功删除,就像第一个0被成功删除一样。此代码仅跳过两个连续的0值的 second 。假设该代码应该删除所有所有 0值,这将是一个错误。

答案 1 :(得分:0)

@rgettman已经给出的答案是正确的。但是,我想补充一点,这是一个常见问题的特殊示例-在迭代序列(索引,无论如何)的同时修改序列(集合,无论如何)的例子。您需要了解修改对正在进行的迭代的影响。有时,效果会被正式表示为“未定义”,即您不想这样做。

对于Java,Iterator <>类具有remove()方法,该方法可以安全地删除当前元素。如果您实际上想从List <>中删除所有零,而不仅仅是解释测试问题中发生的事情,那么Iterator将是解决该问题的一种方法。