检查字符串是否包含字母

时间:2020-07-26 16:09:09

标签: java arraylist

我想检查我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);
    }
}

2 个答案:

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