为什么for循环不会继续

时间:2016-04-06 22:36:35

标签: java for-loop arraylist

我有以下sniped代码,我想从数组p4中删除所有'0'。此数组将被放入arraylist amountOfColorPoints。 for循环应该一直工作到列表大小结束,但是在第一个'0'被删除后它不再执行了,因为我可以在控制台上看到。问题是什么?可以请别人帮助我吗?

int[] p4={0,0,4};

ArrayList<Integer> amountOfColorPoints = new ArrayList<>();

。 。

for(int p=0; p<amountOfColorPoints.size(); p++) {
                if (amountOfColorPoints.get(p) == 0)
                    amountOfColorPoints.remove(p);}

3 个答案:

答案 0 :(得分:3)

从集合中删除元素(在迭代时)的安全方法是使用Iterator.remove()作为Javadoc备注

  

如果在迭代进行过程中以除了调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为。

类似的东西,

Iterator<Integer> iter = amountOfColorPoints.iterator();
while (iter.hasNext()) {
    if (iter.next() == 0) {
        iter.remove();
    }
}

答案 1 :(得分:0)

在循环的每次迭代中,重新计算数组的大小。因此,当你移除位置0上的元素时,数组大小变为2,第二个0移动到位置0,但是p已经是1,所以你跳过第二个0。

正确的代码:

   Iterator<Integer> iter = amountOfColorPoints.iterator();
   while (iter.hasNext()) {
     if (iter.next() == 0) {
       iter.remove();
     }
   }

答案 2 :(得分:0)

你的问题是当你删除一个元素时,所有剩余的元素都会向左移动以填补空白,所以删除后的下一个元素将是相同的索引,但你仍然增加索引。

要使代码工作,请减少索引:

for(int p=0; p<amountOfColorPoints.size(); p++) {
    if (amountOfColorPoints.get(p) == 0)
        amountOfColorPoints.remove(p--); // decrement 
}

更好的方法是使用Iterator,它允许您删除当前元素(不必担心索引)。