Java:高效的 ArrayList 过滤?

标签 java android arraylist

我需要过滤 ArrayList 并删除找到的元素。作为 Java 的新手,我想知道实现此目标的最有效方法是什么(很重要,因为它在移动设备上运行)。目前我这样做:

// We display only top-level dealers (parentId=-10)
ArrayList<DealerProductCount> subDealers = new ArrayList<DealerProductCount>();
for (DealerProductCount dealer : wsResponse.Dealers) {
    if (dealer.ParentId != -10) subDealers.add(dealer);
}
wsResponse.Dealers.removeAll(subDealers);

没有临时对象可以做到吗?也许通过直接操作(删除)被迭代列表的元素?

最佳答案

ArrayList 中高效地删除大量元素需要一些思考。天真的方法是这样的:

Iterator<DealerProductCount> it = wsResponse.Dealers.iterator();
while (it.hasNext()) {
    if (it.next().ParentId != -10) { 
        it.remove(); 
    }
}

问题在于,每次删除一个元素时,您都会(平均)复制剩余元素的一半。这是因为从 ArrayList 中删除一个元素需要在元素向左删除一个位置后复制所有元素。

涉及要删除的元素列表的原始解决方案基本上做同样的事情。不幸的是,ArrayList 的属性不允许 removeAll 比上面的做得更好。

如果您希望删除多个元素,下面的方法更有效:

ArrayList<DealerProductCount> retain =
        new ArrayList<DealerProductCount>(wsResponse.Dealers.size());
for (DealerProductCount dealer : wsResponse.Dealers) {
    if (dealer.ParentId == -10) {
        retain.add(dealer);
    }
}
// either assign 'retain' to 'wsResponse.Dealers' or ...
wsResponse.Dealers.clear();
wsResponse.Dealers.addAll(retain);

我们(几乎)复制整个列表两次,因此如果您删除少至 4 个元素,这应该(平均)收支平衡。


值得注意的是,典型的函数式编程语言/库支持过滤方法,并且可以通过列表一次完成此任务;即效率更高。我认为如果/当 Java 支持 lambda 时我们可以期待显着的改进,并且集合 API 得到增强以使用它们。

更新 并且使用 Java 8 lambda 和流,我们得到它们......对于这个用例。

关于Java:高效的 ArrayList 过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6280722/

相关文章:

android - 如何使用 Zxing 缩短生成二维码的时间

c# - 将 String.Split() 的结果放入 ArrayList 或 Stack

Java:查看ArrayList是否包含具有重复值的ArrayList

java - 如何用java解决selenium webdriver中的 "Method readfile requires 3 parameters but 0 were supplied in the @Test annotation."

java - 前端jsp表单未绑定(bind)到模型: java. lang.ClassNotFoundException

java - 如何修复 jframe 上的空白屏幕并从文本字段设置 vgap 和 hgap 的值

java - Eclipse - 导入了一个项目,Eclipse 给我错误的@override 方法注释错误

java - JAXB 模式与类/包的关系

具有自定义阴影颜色的 Android CardView

java - 从数组列表到数组