Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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中从集合中弹出项目?_Java_Collections - Fatal编程技术网

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

如何在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

JDK或apache commons中是否有一种方法可以“弹出”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;
}

如果您正在寻找类似堆栈的结构,我建议接受
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);