【问题标题】:How should I iterate a priority queue properly?我应该如何正确地迭代优先级队列?
【发布时间】:2012-11-25 08:51:12
【问题描述】:

我有一个涉及迭代优先级队列的 java 分配。队列由带有字符串和 int 的对象组成,我需要有一种方法来检查单独对象的字符串与队列中的所有对象。

最好的方法是迭代器对象吗?这似乎太乱了。我可以出队和入队,但这似乎效率低下。也许是一个 foreach 循环?

【问题讨论】:

    标签: java foreach iterator queue priority-queue


    【解决方案1】:

    是的,如果您需要检查集合中的每个元素,iteratorfor each 可能是最好的。

    Iterator<E> iter = myPriorityQueue.iterator();
    while (iter.hasNext()) {
        current = iter.next();
        // do something with current
    }
    

    或者

    for (Element e : myQueue) {
            // do something with e
    }
    

    【讨论】:

      【解决方案2】:

      一个小细节:如果您的队列有可能在循环期间被修改,那么iteratorfor each 都会导致ConcurrentModificationException;如果在处理过程中队列有可能被修改,您可以使用poll():

          Resource resource;
          while ((resource = resourceQueue.poll()) != null) {
              this.processIncludes(resourceQueue, resource);
          }
      

      【讨论】:

        【解决方案3】:

        如果您不关心排序(在这种情况下 - 为什么要处理 PriorityQueue?),请使用迭代器。如果你想按优先级进行迭代,那么请看Javadoc的建议:

        如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())。

        【讨论】:

        • 确切地说,它基于一个本身确实禁止完全排序的堆。因此,您应该调用 poll,因为这将导致堆将 min/max 筛选到根。但是对于他的要求,排序并不重要,因此他可以通过 for each 循环进行迭代。
        • 我告诉我必须使用优先队列。尽管我遍历它的顺序无关紧要。我只需要检查每个对象字符串以确保它不匹配我的单独对象的字符串
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多