Java初学者q-遍历ArrayList,select+remove items问题

标签 java arrays list

<分区>

我正在尝试从字符串 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));
}

关于Java初学者q-遍历ArrayList,select+remove items问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62957669/

相关文章:

java - 为什么我无法用初始容量初始化匿名字符串数组?

javascript - 显示图像数组中的图像 - Javascript

java - 对两个平行数组进行排序

PHP数组合并同一个键上的两个数组

python - 如何根据索引从 Python 列表中同时删除多个值?

java - 如何利用 WSDL 生成的 Web 服务客户端?

java - reactor lmax 线程转储

java - NetBeans 中的collectd 插件

c# - 将项目集合从列表框转换为通用列表

c# - Unity - 在运行时以编程方式创建 UI 列表