在下面的代码中,我想在第一个“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/