Java:高效的ArrayList过滤?

2024-01-14

我需要过滤 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需要在元素向左删除一个位置后复制所有元素。

您最初的解决方案涉及要删除的元素列表,本质上是做同样的事情。不幸的是,a 的属性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 得到增强以使用它们时,我们可以期待显着的改进。

UPDATE借助 Java 8 lambda 和流,我们可以针对此用例获得它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:高效的ArrayList过滤? 的相关文章

随机推荐