如何从字符串 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
我有一个 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