我需要从列表中删除一些项目时遇到问题。
for (int i = 0; i < list.size() - 1; i++) {
if (list.get(i).length() > 1 && list.get(i + 1).length() > 1) {
list.remove(i+1);
if(i != 0){
i--;
}
}
我放了6个长度大于1的字符串,我收到第1和第3个输出。如果我把那个legnth为1的字符串放入,我收到了很好的输出。
答案 0 :(得分:1)
如果从末尾迭代,编写和更容易理解循环计数器的值会更简单:
for (int i = list.size() - 1; i > 0; i--) {
if (list.get(i).length() > 1 && list.get(i - 1).length() > 1) {
list.remove(i);
}
}
答案 1 :(得分:0)
从列表末尾到开头迭代:因为你删除对象之后你要删除的索引正在改变,所以如果你从头到尾迭代你' ll最终不迭代一些项目。
示例:
列表有3个项目:[1,2,3],size = 3,i = 0,我们删除1(新列表是:[2,3])。现在大小等于2并且i递增:i = 1.现在我们跳过了2!
反向迭代很容易实现:
for (int i = list.size() - 2; i >= 0; i--) {
if (list.get(i).length() > 1 && list.get(i + 1).length() > 1) {
list.remove(i + 1);
}
}
<强>更新强> 如果您知道要删除所有元素,除了可以构建和使用该元素的新列表并使用它,或者您可以执行更简单的操作,例如:
list.removeIf(x -> x != 10000) // available from Java 8
答案 2 :(得分:0)
不完全确定您要在此处执行的操作,但我认为您要删除元素,使得连续不存在两个带有length > 1
的字符串。虽然以相反顺序循环列表的一般建议是合理的,但可能有理由以正确的顺序循环列表。
删除元素后使用i--
的想法是正确的。但是你必须在所有情况下都这样做,不仅如果你不在第一个元素上。删除if
,然后就可以了。
for (int i = 0; i < list.size() - 1; i++) {
if (list.get(i).length() > 1 && list.get(i + 1).length() > 1) {
list.remove(i+1);
i--;
}
}
如果i == 0
,这会将i
设置为-1
,这可能看起来很奇怪,但请记住i++
会将其设置回0
之前循环的下一次迭代。因此,对于11, 22, 33
,它会先比较11
和22
,然后移除22
,然后继续比较11
和33
(并移除{ {1}}等等。
答案 3 :(得分:-2)
问题是您从untrack-->staged-->commit
转到0
,但每次从列表中删除项目时,您都会更改下一项的索引。所以下一次迭代将跳过一个项目
解决方案是从list.size() - 2
转到list.size() - 2
,这样每次删除项目时,下一次迭代都不会关心。您的0
看起来像这样:
for