如何从java中的队列中删除特定元素(不是优先级队列)

时间:2017-08-21 13:23:30

标签: java queue

如何从queue中的java(not priority queue)删除特定元素。没有删除queue.remove(object)的功能。请帮助我。

Queue<String> queue = new LinkedList<>();
queue.add("hello");
queue.add("world");
queue.add("ranjeet");

我想删除&#34; world&#34;从它。

2 个答案:

答案 0 :(得分:2)

队列接口

队列接口只允许您从队列头部删除元素。 请参阅以下API的说明:

https://docs.oracle.com/javase/7/docs/api/java/util/Queue.html#remove()

队列数据结构的全部目的是将项目推送到尾部并将其从头部移除(作为真正的队列工作)。

您应该使用不同的数据结构/集合对象类型。

另一种选择是删除队列中的所有项目并将它们放在另一个队列中(除了要删除的项目)。

最后,另一个是让你自己的队列实现添加额外的方法。

链表

我的链表是一个实现Queue接口的实现,但它也实现了其他接口。

您可以使用以下方法:

  

删除(对象o)   删除指定元素的第一个匹配项   从此列表中,如果它存在。如果此列表不包含   元素,它没有变化。更正式地说,删除元素   最低指数i使得(o == null?get(i)== null:o.equals(get(i)))   (如果存在这样的元素)。如果此列表包含,则返回true   指定的元素(或等效地,如果此列表更改为结果   电话)。

https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#remove(java.lang.Object)

您可以将代码更改为:

LinkedList<String> queue = new LinkedList<>();

OR

List<String> queue = new LinkedList<>();

您为什么使用Queue / LinkedList?

主要问题是你为什么使用队列/链接列表? 似乎基本列表也适合您想要的内容。 如果要删除中间项,则链表不是最合适的。

链表

实现List和Queue的两个接口。 见:

答案 1 :(得分:0)

正确。 Queue没有删除特定对象的方法(在某个索引处,或者等于某些提供的参数):

  

队列通常(但不一定)以FIFO(先进先出)方式对元素进行排序。 ...无论使用什么顺序,队列的 head 是通过调用remove()或poll()来删除的元素。在FIFO队列中,所有新元素都插入队列的尾部。其他类型的队列可能使用不同的放置规则。每个Queue实现都必须指定其排序属性。

原因很简单:Queue不是&#34;随机&#34;访问数据结构。它只支持从head resp中删除元素。尾巴;取决于实施。

从这个意义上说,答案就是:

  • 你要么必须&#34; pop&#34;所有队列中的所有条目都要移除,然后添加后退
  • 您将基础数据结构更改为允许&#34; random&#34;删除操作

请注意:您的代码显示了一个潜在的解决方案。只需将其更改为:

List<String> strings = new LinkedList<>();

突然间,您可以通过索引{&#34;按值&#34;来remove()个对象。

据我所知, no 接口结合了两个接口(List和Queue)。但是,当然有一些实现,例如LinkedList实际上就是这样做的。