Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:高效的ArrayList过滤?_Java_Android_Arraylist - Fatal编程技术网

Java:高效的ArrayList过滤?

Java:高效的ArrayList过滤?,java,android,arraylist,Java,Android,Arraylist,我需要过滤ArrayList并删除找到的元素。由于对Java比较陌生,我想知道实现这一点最有效的方法是什么(因为它在移动设备上运行)。目前我这样做: // We display only top-level dealers (parentId=-10) ArrayList<DealerProductCount> subDealers = new ArrayList<DealerProductCount>(); for (DealerProductCount dealer

我需要过滤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);
//我们只显示顶级经销商(parentId=-10)
ArrayList子交易商=新的ArrayList();
for(DealerProductCount经销商:wsResponse.Dealers){
如果(dealer.ParentId!=-10)子dealer.add(dealer);
}
wsResponse.Dealers.removeAll(次级经销商);

没有临时对象可以完成吗?可能通过直接操作(删除)正在迭代的列表中的元素?

如果使用迭代器,则可以在迭代时安全地删除元素。

一种方法是使用迭代器而不是for each:

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

有效地从
数组列表中删除大量元素需要一些思考。天真的方法是这样的:

Iterator<DealerProductCount> it = wsResponse.Dealers.iterator();
while (it.hasNext()) {
    if (it.next().ParentId != -10) { 
        it.remove(); 
    }
}
我们(几乎)复制了整个列表两次,因此如果您只删除4个元素,这应该是收支平衡(平均)


值得注意的是,函数式编程语言/库通常支持一种过滤方法,并且可以通过列表一次完成这项任务;i、 e.效率更高。我认为,如果Java支持lambdas,并且集合API得到增强以使用它们,我们可以期待显著的改进


更新使用Java 8 lambda和streams,我们可以得到它们。。。对于这个用例。

(如果迭代器提供了一个删除的实现-它可能会抛出一个
UnsupportedOperationException
-因此这只在您非常了解迭代器的情况下起作用)对于其他数据结构,项删除更有效。从LinkedList中删除将具有O(n)性能。从HashMap中删除将具有恒定的时间性能。感谢Stephen,感谢您出色的深入解释!因此,带回家的消息是,填充新的ArrayList通常比从现有ArrayList中删除元素要好。很高兴知道!
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);