Bac*_*chi 10 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);
Run Code Online (Sandbox Code Playgroud)
可以没有临时对象吗?也许通过直接操作(删除)迭代列表的元素?
Ste*_*n C 19
有效地从a中删除许多元素ArrayList需要一些思考.天真的方法是这样的:
Iterator<DealerProductCount> it = wsResponse.Dealers.iterator();
while (it.hasNext()) {
if (it.next().ParentId != -10) {
it.remove();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是每次删除元素时(平均)复制剩余元素的一半.这是因为从元素中删除元素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);
Run Code Online (Sandbox Code Playgroud)
我们两次复制(几乎)整个列表,所以如果你删除少至4个元素,这应该是均衡的(平均).
值得注意的是,函数式编程语言/库通常支持过滤方法,并且可以通过列表一次完成此任务; 即更有效率.我认为,如果/当Java支持lambdas时,我们可以期待显着的改进,并且集合API被增强以使用它们.
更新和Java 8 lambdas和流,我们得到它们......对于这个用例.
| 归档时间: |
|
| 查看次数: |
15804 次 |
| 最近记录: |