java - 从 ArrayList<ArrayList<T>>> 中删除项目

标签 java list arraylist

在下面的代码中,我想在第一个“for 循环”中从 ArrayList 中删除为 null 或 arraylist 的大小为零的项目。运行第一个循环后,我又进行了第二个循环。在第二个循环中,我测试了它是否包含任何为空的项目或项目的大小为零。虽然我在第一个循环中删除,但 ArrayList BS 包含从列表中删除的项目。

ArrayList<ArrayList<Record>> BS = new ArrayList<>(); 
.
.// some codes
.

for (int j = 0; j < BS.size(); j++) {
    if(BS.get(j) == null || BS.get(j).size() == 0){
        BS.remove(j);
    }
}


for (int j = 0; j < BS.size(); j++) {
    if(BS.get(j) == null || BS.get(j).size() == 0){
            System.out.println("Again, fall into if condition");
    }
}

最佳答案

这里的问题是您不会在删除的项目后立即检查该项目。

或者:

BS.removeIf(a -> a == null || a.isEmpty());

或者反向迭代列表:

for (int j = BS.size() - 1; j >= 0; j--) { ... }

或者使用Iterator,并使用remove()方法。

Iterator<? extends List<Record>> it = BS.iterator();
while (it.hasNext()) {
  List<Record> list = it.next();
  if (list == 0 || list.isEmpty()) it.remove();
}

removeIf 是最好的方法,因为它经过优化以了解如何有效地删除许多元素:删除除 ArrayList 的最后一个元素之外的所有元素都需要所有元素更大的索引在内部数组中移动,因此通过简单地调用 remove 删除元素的时间复杂度是二次的。

但是,它仅在 Java 8+ 中可用。 (您可以在早期版本的 Java 中很容易地实现高效删除;只是需要多做一些工作)。

关于java - 从 ArrayList<ArrayList<T>>> 中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47284439/

相关文章:

java - 与 Java Swing 定时器混淆

javascript - 如何在文本区域中创建列表?

c - C中的指针。通过函数更改列表指针的开头

java.util.AbstractList.remove 处的 java.lang.UnsupportedOperationException

java - 使用 ArrayList 中对象的值之一填充组合框

java - 谷歌应用程序引擎实例共享堆和堆栈吗?

java - 在每次调用时生成唯一的随机数

java - 如何处理 JavaFX 中一个类的多种事件类型?

php - 如何将多行数据转换为数组并从另一个数组中减去它?

java - ArrayList 的外键等效吗?