我正在为计算机科学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个仍保留在列表中?
答案 0 :(得分:3)
第一个0
仍然存在,因为那实际上是0
中的第二个nums
。
当k
为0
时,测试成功并调用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将是解决该问题的一种方法。