从列表中删除项目

时间:2017-11-02 17:10:21

标签: java list

我需要从列表中删除一些项目时遇到问题。

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的字符串放入,我收到了很好的输出。

4 个答案:

答案 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,它会先比较1122,然后移除22,然后继续比较1133(并移除{ {1}}等等。

答案 3 :(得分:-2)

问题是您从untrack-->staged-->commit转到0,但每次从列表中删除项目时,您都会更改下一项的索引。所以下一次迭代将跳过一个项目

解决方案是从list.size() - 2转到list.size() - 2,这样每次删除项目时,下一次迭代都不会关心。您的0看起来像这样:

for

这里有the working result