【问题标题】:How do I get the nth item in a Queue?如何获取队列中的第 n 个项目?
【发布时间】:2012-03-09 16:34:05
【问题描述】:

我的应用程序中有许多队列和优先级队列。我想轻松访问这些队列中的第 n 个项目,但没有看到使用 API 的简单方法。

我想我可以创建一个 Iterator 并迭代到第 n 个元素或使用 toArray()[index],但似乎应该有更简单的方法。

我错过了什么吗?

【问题讨论】:

  • 使用 ArrayList 作为堆栈。当您需要特定项目时,您可以使用 get(x)。
  • 这不违背队列的想法吗?队列应该是 FIFO 结构,而不是像地图或数组那样的按需访问。您是否有理由使用队列而不是列表之类的东西?
  • Queue 接口不公开对其元素的直接元素访问,仅对前面公开,并通过迭代器访问。为了您的使用,您可能需要一个基于List 的集合。

标签: java queue


【解决方案1】:

我错过了什么吗?

是的 - 按索引访问元素不是队列概念的一部分。

如果您需要按索引访问元素,您需要一个列表,而不是队列。

【讨论】:

    【解决方案2】:

    对您来说最简单的解决方案是使用自平衡的binary search tree,例如AVL tree, splay tree or red-black tree。它允许您在 O(log n) 时间内通过键访问元素,并在 O(log n + k) 中按顺序遍历对象,其中 k 是迭代的元素数量..!!

    【讨论】:

    • 这些选项中的任何一个都是过度杀伤 IMO。
    • 基于数组的队列或列表将为您提供 O(1)。还有一个非常快的 O(1)。
    【解决方案3】:

    队列的全部意义在于仅公开对头部(第一个元素)的访问。如果您想任意访问线性数据结构中的元素,请使用List(如果您进行的查找比推送/弹出更多,请考虑使用ArrayList,因为LinkedLists 未针对随机访问进行优化)。

    【讨论】:

    • LinkedList 实现 QueueArrayList 没有。
    • @his:我的回答是他不应该使用队列 ADT,因为它不支持随机访问,但他应该使用 List(两者都实现)。所以我没有看到相关性。
    【解决方案4】:

    我的应用程序中有许多队列和优先级队列

    Queues 使用什么具体数据类型? LinkedList? 在这种情况下,您应该能够通过转换回链表来获得 nth 元素。

    但这不是您使用Queue 的方式

    至于优先级队列,从您的问题来看,您似乎也没有使用正确的数据结构。

    优先队列将始终返回最小元素(通过排序)。
    那么这里的n 元素是什么意思?最小的n 或插入的n 还是什么?所以我们真的不能说在这种情况下该怎么做

    【讨论】:

    • 请注意,获取LinkedList 的第n 个元素相当于将Queue 迭代到第n 个元素。
    • @MarkPeters:你是对的,但这不是Queue 的正确用法,在代码中看到这一点很尴尬。所以最好使用例如直接作为LinkedList,因为它反映了你正在努力做得更好
    • @user:我同意只使用List 更好,但在我看来,迭代Queuecasting 回到@987654334 要好@ 因为那是把你自己耦合到一个实现细节。如果 OP 有能力更改提供 Queue 的代码,我完全同意。
    • 我有一个应用程序,我相信我可以证明使用队列是合理的,但仍然需要访问队列中的项目。每次按下按钮并将对象(包含时间和其他属性 - 尚未分配)推送到队列时,我都会记录时钟时间。它们出现在列表视图中。用户可以将属性分配给它们并从顶部将它们从队列中弹出(将它们从队列中弹出)以进行保存。 Queue 正是我需要推送和弹出它们的,而我只有五六行代码,在一个地方重新找到一个 Queue 项。
    【解决方案5】:

    队列不允许按概念进行随机索引访问,因此接口也不允许这样做是件好事。如果您同时需要两种访问方式(这对设计来说是个坏兆头),那么您可以使用同时实现ListQueue 的数据类型(例如LinkedList)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多