【问题标题】:What type of Blocking Queue should i use?我应该使用什么类型的阻塞队列?
【发布时间】:2011-12-14 13:19:20
【问题描述】:

我想实现一个可以随时以任何方式添加元素的阻塞。但我必须能够按顺序访问它们。

例如,考虑添加了元素 1、4、8、10 的 x 元素队列。所以 10 可以访问,但直到 9 被添加和访问,8 不能。总之,所有的元素都是相互关联的。

如果 java 已经实现了这种类型的集合,请告诉我。所以我可以直接使用它。

【问题讨论】:

  • 不确定我是否理解这个问题;但是一个 10 的数组还不够,当您遇到一个空值时,您只需在数组中停止迭代吗?如果我从 1 开始,我将无法进入 2,但是 10 呢?如果 2 在您的阵列中,我是否可以从 1 到 2 或从 2 到 1 但不能从 2 到 3?顺序访问将由您有一个基于传递给函数的参数的 LOOP 升序或降序的事实来控制。

标签: java data-structures collections queue


【解决方案1】:

您说的是堆栈还是队列,具体取决于您希望它们是 FIFO 还是 LIFO,并首先按数字顺序插入元素 - 这意味着您正在对插入时的元素,因此它们始终按正确的数字顺序排列。

通过在排序时按数字顺序对元素进行排序,可以保证在删除它们时它们将按照您期望的顺序排列。

您可以使用 Java 的 LinkedList 将元素插入到列表中您希望它们的位置,也可以根据需要从列表的“后部”或“前部”中删除它们。

最后,为了确保您不能删除一个项目,除非它是序列中的下一个,您需要在从列表中删除它之前简单地检查该值,以确保它是按顺序排列的下一个删除的最后一个元素之后。如果它不符合该条件,则返回“false”或其他指示此时无法从列表中删除任何内容的值。

另外,看看这个问题:Creating a blocking Queue<T> in .NET? - 它不是 Java,但它非常相似,可能会提供一些见解。

【讨论】:

  • 小补充:如果我正确理解了您的解释,您可能希望保留一个指向最后一个有效元素的光标(例如在 [1,2,3,4,6,7,8]它指向 4,因为无法检索 6 及更高版本。您的光标只需要在添加元素时更新。
【解决方案2】:

使用按顺序向其推送项目的逻辑包装队列。例如。创建一个实现 Queue 和 BlockingQueue 的类。大多数方法(如 get)直接委托给内部 ArrayBlockingQueue 之类的东西,但“put”会将内容按顺序放入内部 ArrayBlockingQueue。如果调用 put 时使用了一个尚不能访问的元素,则将其存储在另一个中间数据结构中。

每次使用“下一个”元素调用 put 时,您将其推送到队列中,然后遍历中间数据结构并将任何元素添加到现在可以添加的队列中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多