我想检查我ArrayList中的所有字符串是否都包含字母“ L”。
如果是,则应删除该字符串。
我想知道为什么不是所有带有“ L”的字符串都被删除了?
结果是:
Rose
Leier
Rose
Rose
Rose
代码:
list.add("Leier");
list.add("Rose");
list.add("Liebe");
list.add("Leier");
list.add("Leier");
list.add("Rose");
list.add("Leier");
list.add("Rose");
list.add("Leier");
list.add("Rose");
list.add("Leier");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).matches(".*[L].*")) {
list.remove(i);
}
}
答案 0 :(得分:1)
当您从列表中删除一个项目时,它将所有剩余的项目移到列表的前面。因此,假设您删除了索引5
上的项目:现在索引6上的项目将移动到位置5,位置7到6,依此类推。
删除项目后,您增加i
,因此接下来检查索引6。但是索引6包含曾经在索引7中的项目-您已跳过了一个项目!
有几种方法可以解决此问题。一种是使用更高级别的removeIf
方法。
list.removeIf(item -> item.matches(".*[L].*"));
另一个人正在使用Iterator
遍历列表并删除项目。
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
String item = iterator.next();
if (item.matches(".*[L].*")) {
iterator.remove();
}
}
第三种是颠倒迭代顺序:如果您从列表的末尾开始进行迭代,则对列表索引的更改不会影响您。
for (int i = list.size() - 1; i >= 0; i--) {
if (list.get(i).matches(".*[L].*")) {
list.remove(i);
}
}
顺便说一句,如果您真的只需要检查字符串是否包含字母L
,则使用contains
方法而不是matches
会更容易:item.contains("L")
答案 1 :(得分:-1)
尝试一下,别忘了将其小写
for (int i = 0; i < list.size(); i++) {
if (list.get(i).toString().toLowerCase().contains("l")) {
list.remove(i);
}
}