【问题标题】:PriorityQueue not sorting on addPriorityQueue 未在添加时排序
【发布时间】:2011-08-07 09:23:15
【问题描述】:

我有一个优先级队列,我在其中添加了一个节点对象,节点应该按它们包含的值排序。由于某种原因,优先级队列不会在添加时对节点进行排序。如果有人对此有任何问题或有任何指导,我将不胜感激。下面是一个简单的例子:

PriorityQueue<Node> PQ = new PriorityQueue<Node>();
        //for each entry create a node and add it to the PriorityQueue
        for(Entry<Character,Integer> entry : entries){
            PQ.add(new Node(entry.getKey(),entry.getValue(), true));
        }

这里是节点的compareTo方法:

@Override
public int compareTo(Node n) {
  if(n.frequency.intValue() > this.frequency.intValue()) return  -1;
  else if(n.frequency.intValue() == this.frequency.intValue()) return 0;
  else return 1;
}

【问题讨论】:

    标签: java sorting priority-queue


    【解决方案1】:

    我猜你希望PriorityQueue 在迭代时以特定顺序返回元素。但是,PriorityQueue 没有提供这样的行为,因为它是作为优先级堆而不是排序列表实现的。来自javadoc

    方法 iterator() 中提供的迭代器不能保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())。

    PriorityQueue 提供的唯一保证是poll()peek() 等返回最少的元素。如果您需要元素的有序迭代,请使用其他一些集合,例如 TreeSet

    【讨论】:

    • 对,但我希望在使用 remove() 方法删除每个对象时对其进行排序
    • @Trevor:你没有展示迭代代码。请更新您的问题以显示一个显示但完整示例,我们可以编译和运行。
    • 没关系,我现在意识到在 remove() 对象已排序。谢谢大家
    • 哇哦,真的吗?在这里,我认为我为此目的开设了完美的课程。 :(
    【解决方案2】:

    对于希望如何按照订单迭代队列的任何人,这可以通过使用pollremove 来实现。

    while (!queue.isEmpty())
        System.out.println(queue.poll());
    
    while (!queue.isEmpty())
        System.out.println(queue.remove());
    

    poll()remove() 之间的唯一区别是,poll 为空时返回 null,而 remove 则抛出 NoSuchElementException

    【讨论】:

    • foreach 循环不会根据优先级查看项目,但轮询清除了疑问。
    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多