Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从ArrayList中删除字符串_Java_Arraylist - Fatal编程技术网

Java 从ArrayList中删除字符串

Java 从ArrayList中删除字符串,java,arraylist,Java,Arraylist,我正在尝试使用一个方法,该方法将字符串的ArrayList作为参数,并从中删除所有长度为偶数的字符串。这就是我到目前为止所做的: public void removeEvenLength(ArrayList<String> items) { for (String s : items) { if (s.length() % 2 == 0) items.remove(s); } } public void removeEventLength(Array

我正在尝试使用一个方法,该方法将字符串的ArrayList作为参数,并从中删除所有长度为偶数的字符串。这就是我到目前为止所做的:

public void removeEvenLength(ArrayList<String> items) {
    for (String s : items) {
        if (s.length() % 2 == 0) items.remove(s);
    }
}
public void removeEventLength(ArrayList项){
用于(字符串s:项){
如果(s.length()%2==0)项。删除(s);
}
}

由于某些原因,这不起作用,当我尝试在任何包含元素的ArrayList上运行它时,它会显示一个错误。有人能告诉我为什么吗?提前感谢您的帮助。

您不能从
列表中删除项目,同时在循环中运行。使用
迭代器

List<String> items = ....
Iterator<String> it = items.iterator();
while (it.hasNext()) {
   String s = it.next(); 
    if (s.length() % 2 == 0){
         it.remove();
     }

}
列表项=。。。。
Iterator it=items.Iterator();
while(it.hasNext()){
字符串s=it.next();
如果(s.length()%2==0){
it.remove();
}
}

您必须使用冗长的成语:

for (Iterator<String> it = items.iterator(); it.hasNext();)
  if (it.next().length() % 2 == 0) it.remove();
for(Iterator it=items.Iterator();it.hasNext();)
如果(it.next().length()%2==0)it.remove();

原因:增强的for循环编译成如上所述的代码,当您使用
迭代器
时,除了调用
迭代器#remove
之外,不允许通过任何其他途径更改基础列表,这样迭代器就可以知道删除了。

在对列表进行迭代时从列表中删除项是很危险的。尝试使用
while
循环和
迭代器(
items.Iterator()
)。然后调用
iterator.remove()
方法来删除当前项。无论何时,只要你询问错误,为了宙斯的爱,请发布错误。在这种情况下,问题很明显,但这是一个普遍的好主意。实际上,我可以使用循环并从列表中删除项。问题只存在于增强for循环,它创建自己的迭代器,该迭代器会注意到列表何时被修改并引发异常。我喜欢使用2行的方式,但我如何调试它?我不使用调试器,所以我不习惯将代码调整到该问题。如果我曾经对这样的代码有stacktrace问题,那么我会临时拆分行。您可以对调试执行相同的操作。顺便说一句,实际上我会用一行代码,我只是因为SO代码框的限制才将其拆分:)首先,选择短代码而不是可读性在大多数情况下是没有用的,这只是我的观点。其次,您忘记了for循环中的第二个分号。@Pr0gr4mm3r我选择可读性,这就是为什么我将代码放在一行上。这样读起来更流利,就像一个英语句子。此外,紧凑的代码意味着在一个屏幕上同时看到更多的代码,这对于我在一次集中大量代码时非常重要。你可以随意拥有和我不同的阅读技巧。哦,非常感谢你遗漏了分号。这不是我们的阅读技能有多不同的问题。基本上,这只是一个如何定义可读性的问题。但这只是离题,与问题本身无关,所以让我们退出。