如何在Java中从集合中弹出项目?
JDK或apache commons中是否有一种方法可以“弹出”java.util.list中的元素列表?我的意思是,删除元素列表并返回它,如下方法:如何在Java中从集合中弹出项目?,java,collections,Java,Collections,JDK或apache commons中是否有一种方法可以“弹出”java.util.list中的元素列表?我的意思是,删除元素列表并返回它,如下方法: public Collection pop(Collection elementsToPop, Collection elements) { Collection popped = new ArrayList(); for (Object object : elementsToPop) { if (elements.conta
public Collection pop(Collection elementsToPop, Collection elements) {
Collection popped = new ArrayList();
for (Object object : elementsToPop) {
if (elements.contains(object)) {
elements.remove(object);
popped.add(object);
}
}
return popped;
}
如果您正在寻找类似堆栈的结构,我建议接受
Deque
(LinkedList
是最常见的实现),而不是集合
如果您实际上不需要将其视为堆栈,只需从集合中获取迭代器
,然后使用remove()
方法:
for (Iterator<SomeType> it = elements.iterator(); it.hasNext(); ) {
SomeType e = it.next();
it.remove();
popped.add(e);
}
如果你的主要观点是你需要确切地知道哪些元素被弹出,我想你还是停留在你原来的代码上。我想没有,因为你对“弹出”操作的定义是非常不标准的。通常它不接受任何参数(集合本身除外),返回并删除最上面的参数
但是一旦您注意到ApacheCommons,这将实现与您的代码相同的效果
Collection result = CollectionUtils.intersection(a, b);
a.removeAll(b);
编辑
没有一种方法完全符合您的要求,但看起来您已经非常熟悉您的代码了
一些建议:
- 如果元素是任意集合,请考虑使用removeAll(对象)而不是remove(对象),因为您可能需要删除重复项(例如,如果元素是列表)
- contains()对于某些集合类型(例如列表)速度较慢,因为它需要遍历整个数据结构。鉴于这是在您的内部循环中,您将面临O(n^2)性能问题的风险。如果您可以使算法与HashSet或HashMap一起工作,那么contains()将以O(1)为单位,并且您的算法将更加高效
在JDK提供的标准方法中没有这种方法。ApacheCommons提供了
编辑:正如其他回答者所指出的,您使用术语
pop
是不标准的。通常
pop操作从[堆栈]的顶部删除项目
Wikipedia有一个。链表提供了您所需的功能,提供了一种推送和弹出方法
请参阅提供的:实际上,我似乎没有仔细阅读。你对“流行音乐”有一个非常不标准的定义,这误导了我发布这个答案。我知道“pop”不是最好用的词,所以我举了一个我想要的例子。但是看起来没有为JDK或apache commons实现这样的方法,所以,现在,我将继续使用我自己的方法,我将使用您的迭代器提示,谢谢!请注意,您可以测试remove()的结果并跳过代码中的contains检查。您可能还希望查看如何使用集合。+1表示减法;removeAll不像海报片段那样尊重基数。但这并不能给你一个像他那样被删除的元素列表。@Mark,嗯,你说得对;我读了描述,但没有读来源,误解了+我会继续找的。
Collection result = CollectionUtils.intersection(a, b);
a.removeAll(b);