【问题标题】:how to remove a specific element from queue in java(not priority queue)如何从java中的队列中删除特定元素(不是优先级队列)
【发布时间】:2017-08-21 13:23:29
【问题描述】:

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

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

我想从中删除“世界”。

【问题讨论】:

  • 能否添加代码以显示问题所在并帮助您解决问题
  • queue.remove("world");这条线对我有用。

标签: java queue


【解决方案1】:

队列接口

队列接口只允许您从队列头部移除元素。 参见 API 说明:

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

队列数据结构的全部目的是将项目推到尾部并从头部移除它们(就像真正的队列一样)。

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

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

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

链表

我的linkedlist是一个实现了Queue接口但也实现了其他接口的实现。

你可以用这个方法:

移除(对象 o) 删除指定元素的第一个匹配项 从此列表中(如果存在)。如果此列表不包含 元素,它是不变的。更正式地说,删除带有 最低索引 i 使得 (o==null ? get(i)==null : o.equals(get(i))) (如果存在这样的元素)。如果此列表包含 指定的元素(或等效地,如果此列表因此而更改 通话)。

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

您可以将代码更改为:

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

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

为什么要使用队列/链表?

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

链表

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

【讨论】:

  • 其实这只是代码的一部分..我必须在其他部分使用队列的功能。这就是我使用队列的原因。
  • @Ranjeet Kumar yadav ,如果你想删除中间元素,你应该使用一个列表。但是,如果您坚持使用队列,则解决方案是将所有元素重新插入一个新队列(您不想要的除外)。见:stackoverflow.com/a/22454237/1688441
【解决方案2】:

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

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

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

从这个意义上说,答案是以下之一:

  • 您要么必须将队列中的所有条目“弹出”到要删除的条目,然后再添加它们
  • 您将底层数据结构更改为允许“随机”删除操作的东西

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

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

突然之间,您可以通过索引或“按值”remove() 对象。

据我所知,no 接口结合了两个接口(列表和队列)。但当然,也有一些实现,例如 LinkedList 确实可以做到这一点。

【讨论】:

  • 你能给我推荐一些其他的数据结构吗?它的作用类似于队列,也可以使用对象引用来删除元素。
  • @GhostCat 不完全正确。 LinkedList 实现了 List 和 Queue 两个接口。如果他只是替换变量定义,它将起作用。 LinkedList&lt;String&gt; queue = new LinkedList&lt;&gt;(); 我认为您的意思是没有实现两者的接口。 @Ghostcat,见:i.prntscr.com/fUucDm_JQtm9ye3e3L3bZw.png
  • 是的,我急着把它写下来。更改并修复。顺便说一句,你得到了一个很好的答案,-)
  • @GhostCat 谢谢。你也是!无关,那是你的真猫吗?看起来类似于俄罗斯蓝。看起来棒极了!
  • 是的。我的猫。但是称他为俄罗斯蓝几乎让我想撤销我对你的回答的支持;-O。他是chartreux ...我必须链接到德国维基百科文章 - 英文版只显示了一张“最有可能是俄罗斯蓝猫”的猫图片。疯狂的世界。
【解决方案3】:

queue.remove(obj) 在您将 Queue obj 实例化为链接列表时将不起作用。 你必须使用

queue.remove(idx) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    相关资源
    最近更新 更多