在JDK或apache公共中是否有一个方法来“弹出”java.util.List中的元素列表?我的意思是,删除元素列表并将其返回,如下所示:
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;
}
答案 0 :(得分:11)
如果您正在寻找类似堆栈的结构,我建议接受Deque
(LinkedList
是最常见的实现),而不是Collection
。
如果您实际上不需要将其视为堆栈,只需从Collection
获取迭代器并使用remove()
方法:
for (Iterator<SomeType> it = elements.iterator(); it.hasNext(); ) {
SomeType e = it.next();
it.remove();
popped.add(e);
}
请注意remove是一个可选操作,有些实现可能会抛出UnsupportedOperationException
(例如,Collections.unmodifiable...()
中的Collection返回的迭代器将会出现。)
修改:在仔细查看您的问题后,我认为您只需要这样:
elements.removeAll(elementsToRemove);
如果您的主要观点是,您需要确切地知道实际弹出了哪些元素,我认为您仍然坚持原始代码。
答案 1 :(得分:2)
标准的JDK提供的方法中没有这样的方法。 Apache Commons提供the ListUtils.subtract()
method。
编辑:正如其他回答者所指出的那样,您对pop
一词的使用是非标准的。通常,
弹出操作从[堆栈]
的顶部删除一个项目
答案 2 :(得分:1)
我想不,因为你对'pop'操作的定义非常不标准。通常它不需要参数(除了集合本身)并返回并删除最顶层的参数。
但是一旦你注意到apache commons,这将达到与你的代码相同的效果。
Collection result = CollectionUtils.intersection(a, b);
a.removeAll(b);
修改强>
http://commons.apache.org/collections/api-release/index.html
答案 3 :(得分:1)
Linked List可根据需要提供功能,提供push和pop方法。
请参阅提供的documentation:
答案 4 :(得分:0)
没有一种方法与您要求的方法完全相同,但看起来您已经非常接近您的代码了。
一些建议:
如果元素是任意集合,请考虑使用removeAll(object)而不是remove(object),因为您可能需要删除重复项,例如如果元素是一个列表。
contains()对于某些集合类型(例如列表)来说很慢,因为它需要遍历整个数据结构。鉴于这是在您的内循环中,您将面临O(n ^ 2)性能问题的风险。如果你可以使算法使用HashSet或HashMap,那么包含()将由O(1),你的算法将更有效。