我正在尝试从字符串 ArrayList 中删除偶数长度的单词,它几乎可以正常工作,只是由于某种原因,一个偶数编号的单词正在通过。
我的代码:
public ArrayList<String> removeEvenLength(ArrayList<String> a) {
for (int i = 0; i < a.size(); i++) {
String wordEntry = a.get(i);
if (wordEntry.length() % 2 == 0) {
a.remove(i);
}
}
return a;
我一定是遗漏了什么,但我无法确定到底是什么。非常感谢您的指点。
问题是您在迭代 ArrayList 时修改它,这会改变它的大小。每次删除一个元素时,您都需要将索引减一,因为该索引现在将引用下一个元素。
public static ArrayList < String > removeEvenLength(ArrayList < String > a) {
for (int i = 0; i < a.size(); i++) {
String wordEntry = a.get(i);
if (wordEntry.length() % 2 == 0) {
a.remove(i);
i--;
}
}
return a;
}
向后循环也可以解决这个问题,因为元素永远不会移动到您尚未检查的位置。
public static ArrayList < String > removeEvenLength(ArrayList < String > a) {
for (int i = a.size() - 1; i >= 0; i--) {
String wordEntry = a.get(i);
if (wordEntry.length() % 2 == 0) {
a.remove(i);
}
}
return a;
}
您还可以在 Java 8 及更高版本中使用 List#removeIf
来更轻松地完成此操作。
public static ArrayList < String > removeEvenLength(ArrayList < String > a) {
a.removeIf(str -> str.length() % 2 == 0);//or str.length() & 1 == 0
return a;
}
您可以使用 Stream#filter
构造一个新的 List
,其中包含奇数长度的 String
,而无需修改旧的。
public static ArrayList < String > removeEvenLength(ArrayList < String > a) {
return a.stream().filter(str -> str.length() % 2 == 1).collect(Collectors.toCollection(ArrayList::new));
}