如何从Java中的集合中弹出项目?

时间:2010-06-08 15:36:32

标签: java collections

在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;
}

5 个答案:

答案 0 :(得分:11)

如果您正在寻找类似堆栈的结构,我建议接受DequeLinkedList是最常见的实现),而不是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一词的使用是非标准的。通常,

  

弹出操作从[堆栈]

的顶部删除一个项目

维基百科有nice description of stacks

答案 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),你的算法将更有效。