Java 从列表中删除项目

Java 从列表中删除项目,java,list,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--; } } for(int i=0;i1&&li

当我需要从列表中删除某些项目时,我遇到了问题

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--;
        }
    }
for(int i=0;i1&&list.get(i+1).length()>1){
列表。删除(i+1);
如果(i!=0){
我--;
}
}

我输入了6个长度大于1的字符串,并在输出1和3中接收。如果输入长度为1的beggining字符串,则接收到良好的输出。

从列表的末尾到开头迭代:由于要删除对象,所以要删除的索引后的索引会发生变化,因此如果从开始到结束进行迭代,则最终没有迭代某些项

例如:

列表有3项:[1,2,3],大小=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

如果从末尾进行迭代,则编写更简单,也更容易理解循环计数器的值:

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
的字符串。虽然按相反顺序循环列表的一般建议是合理的,但可能有理由按正确的顺序循环列表

您在删除元素后使用
i--
的想法是正确的。但您必须在所有情况下都这样做,而不仅仅是在您不在第一个元素上。如果删除
,那么它应该会起作用

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--;
    }
}
for(int i=0;i1&&list.get(i+1).length()>1){
列表。删除(i+1);
我--;
}
}

如果
i==0
,这会将
i
设置为
-1
,这可能看起来很奇怪,但请记住
i++
会在循环的下一次迭代之前将其设置回
0
。因此对于
11、22、33
,它将首先比较
11
22
,然后删除
22
,并继续比较
11
33
(以及删除
33
等等)。

问题是您要从
0
转到
list.size()-2
,但每次从列表中删除一个项目时,您都在更改下一个项目的索引。因此,下一次迭代将跳过一个项目

解决方案是从
list.size()-2
转到
0
,这样每次删除一个项目时,下一次迭代都不会在意。您的
for
将如下所示:

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);
    }
}

这里您有

我不知道您在问什么和/或试图告诉我们什么。这将导致一个
ConcurrentModificationException
,这意味着您不能在迭代时修改集合。@alfasin是的,我有这个例外。@mustabelMo,为什么?如图所示,使用foreach时,显然会导致引用的异常上面提到:
ConcurrentModificationException
,但这里的迭代是使用索引执行的,很抱歉有误导性的评论。好的,但我已经输入了10000个,我只需要保留10000@Mateusz对不起,我不清楚你想做什么-你能用进一步的解释更新你的问题吗在?@Tom true上,因为每次迭代都会对
list.size()
进行评估(我不知道这一点-不确定以前的Java版本是否如此)结果将是某些项将不会被遍历。答案已更正。我认为这没有被更改。可能您指的是另一种类型的循环?可能类似于
for(String s:getListOfStrings())
,因为
getListOfStrings()
将只计算一次。@Mateusz在这种情况下,您可以做得更简单:
list.removeIf(x->x!=10000)
线程“main”java.lang.IndexOutOfBoundsException:索引:5,大小:5它不起作用:(@Mateusz我怀疑你没有复制粘贴。如果你完全按照写的那样复制粘贴,它会工作的here@Mateusz特别是,我怀疑您忽略了我将第二个条件从原来的
list.get(I+1)更改为
list.get(I-1)
OutOfBoundException@Mateusz我试过的时候没有。是为了什么?你确定你没有把那个补丁和其他补丁弄混吗?我不知道这怎么可能会产生那个错误。在
if
块之后,你还有其他操作吗?哇,两次没有原因的否决票。奇怪的是,我解释了这个错误的原因e错误,并在接受答案(稍后编辑)之前给出了解决方案。人们认为是另一种方式吗?我不知道。当其他人编辑他们的问题时,堆栈溢出是否应该让用户更清楚?可能。Hotel?Trivago