如何从字符串 ArrayList 中删除特定字符串

How to remove a specific String from a String ArrayList

我有一个 ArrayList,其中包含来自文件的一堆单词,每个单词都位于它们自己的单元格中。其中一些词是完整的词,例如“物理学家、水、重力”。然而,其他单词只是在整个程序过程中被拆分的字母。例如,“it's”变成了“it”和“s”。因此,我想删除除“I”和“A”之外的所有单个字母 words,因为它们是实际单词。

这是我目前拥有的代码:

for(int i=0;i<dictionnary.size();i++) {
            if(dictionnary.get(i).compareToIgnoreCase("I")!=0||dictionnary.get(i).compareToIgnoreCase("A")!=0||dictionnary.get(i).length()==1){
                dictionnary.remove(i);
            }
    }

其中dictionnary 是我的ArrayList。但是,当我打印出 arrayList 的内容时,它的“s”仍然存在。我还知道最初有一个单词“E”在上面的整个过程中被删除了。我很困惑为什么“S”仍然存在以及如何修复它。

根据我的理解,这段代码遍历 ArrayList 并检查大小写的长度是否为 1(所有单个字母 words 都是这种情况)以及检查是否无论是否大写,该案例都是“I”或“A”的案例。然后删除不符合“I”或“A”的情况。

考虑使用集合迭代器在迭代期间安全移除元素。

for (Iterator<String> iter = dictionary.iterator() ; iter.hasNext() ; ) {
  String word = iter.next();
  if (word.length() == 1 
      && !"I".equals(word)
      && !"A".equalsIgnoreCase(word)) {
    iter.remove();
  }
}

改用迭代器。假设您有一个列表 (1,2,3,4,5) 并且您想要删除数字 2 和 3。您开始循环并到达第二个元素 2。这里您的 i 是 1 . 您删除该元素并转到 i=2。你现在拥有的是 (1,3,4,5)。从 i=2 开始,您错过了一个元素。

这就是您应该改用迭代器的原因。参考@vsfDawg 的回答。

我的建议如下:

您可以在下一个方法中使用 removeIf。

removeIf 采用谓词。

public static void main(String[] args) {
    List<String> dictionary =  new ArrayList<>();
    dictionary.add("I");
    dictionary.add("A");
    dictionary.add("p");
    dictionary.add("its");
    dictionary.add("water");
    dictionary.add("s");
    Integer sizeRemove =1;
    dictionary.removeIf(
            word ->
            !"I".equals(word)
            && !"A".equalsIgnoreCase(word)
            && word.length() == sizeRemove
    );
    System.out.println(dictionary);
}

输出如下: [我,A,其,水]

参考: https://www.programiz.com/java-programming/library/arraylist/removeif