【问题标题】:Iterate through Queue of Objects in Order按顺序遍历对象队列
【发布时间】:2013-05-29 09:56:51
【问题描述】:

我创建了一个包含对象的队列,我希望按照它们在队列中的放置顺序对其进行迭代(第一个对象放置在队列中,第二个对象放置在队列中,第三个对象......)

我在网上看到了一种这样做的方法,但我不确定这是否能保证队列中的对象将以正确的顺序被访问?

for(MyObject anObject : queue){
    //do someting to anObject...

感谢您的帮助。

【问题讨论】:

  • 让你的队列实现List.
  • queue的类型是什么?

标签: java object queue


【解决方案1】:

这取决于您使用的Queue 实现。

例如LinkedList 保证迭代将按 FIFO(插入)顺序返回元素。这是因为它实现了Deque interface

但一般来说,其他类型的队列不一定是这样。

javadoc for Queue 声明:

队列通常(但不一定)以 FIFO(先进先出)方式对元素进行排序。例外情况包括优先级队列,它根据提供的比较器或元素的自然顺序对元素进行排序,而后进先出队列(或堆栈)对元素进行后进先出(后进先出)排序。

它还补充说:

每个队列实现都必须指定其排序属性。

所以您只需检查您正在使用的特定队列的 javadoc,您应该会找到答案。

【讨论】:

  • 我的队列定义如下:Queue<my_class> queue = new LinkedList<my_class>。如果我使用上面的代码,这会按照我的预期工作吗?因为它不是Prority Queue。谢谢
  • LinkedList 也实现了 Deque,也就是 FIFO。因此,您的迭代顺序将对应于插入顺序(如果您插入 1 然后 2,则在迭代时您将读取 1 然后 2)。
  • 太好了。感谢您的帮助 assylias。
  • @Giri 您可以在此页面的第二个表中查看 Queue 方法如何应用于 Deque 的详细信息:docs.oracle.com/javase/7/docs/api/java/util/Deque.html
  • 很抱歉,如果我的评论显得咄咄逼人,那不是本意。我只是觉得您的回答应该包含实际的实现。
【解决方案2】:

我认为在这种情况下使用 ArrayList 会更好。请尝试一下。为什么你只想使用队列?

【讨论】:

  • 学校有时需要在项目中使用队列。我知道。太可怕了。
  • 如果您需要 FIFO(先进先出)数据结构,那么队列是 ArrayList 的合适选择。 ArrayList 可能不适合使用的数据结构的原因是因为另一个开发人员(或者甚至您自己,如果您忘记了需要 FIFO)可以轻松编写代码以开始从 ArrayList 中间删除项目,这会损害 FIFO 数据结构这是最初需要的。您显然可以使用 ArrayList 作为 FIFO 数据结构,但这必须由开发人员执行,而不是选择的数据类型。
【解决方案3】:

将您的队列实现为 LinkedList。然后,您可以按插入的顺序遍历对象。您必须声明要插入队列的对象的类型,这样您就不会收到任何错误。您可以将其保留为对象并将其指定为对象队列,然后您的上述代码将起作用。见下文。

Queue<Object> queue = new LinkedList<Object>();
// add your objects here
// EX: queue.add(new MyObject)

for(Object item : queue){
    System.out.println(item.toString());
}

【讨论】:

    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2017-07-29
    • 2013-07-13
    相关资源
    最近更新 更多