PriorityQueue 在添加时未排序

发布于 2024-11-02 05:35:01 字数 678 浏览 4 评论 0 原文

我有一个优先级队列,我在其中添加一个节点对象,其中节点应按它们包含的值排序。由于某种原因,优先级队列不会在添加时对节点进行排序。如果有人能发现其中的问题或有任何指导,我很感激。这是一个简短的示例:

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;
}

I have a Priority Queue in which I add a Node object to, where the Nodes should be sorted by a value that they contain. For some reason, the priority queue will not sort the Nodes on add. If anyone can see something wrong with this or has any guidance, I appreciate it. Here is a brief example:

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));
        }

here is the node's compareTo method:

@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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

会傲 2024-11-09 05:35:01

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

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

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

I guess you expect PriorityQueue to return elements in particular order when you iterate it. However, PriorityQueue doesn't provide such a behaviour, because it's implemented as a priority heap rather than sorted list. From javadoc:

The Iterator provided in method iterator() is not guaranteed to traverse the elements of the priority queue in any particular order. If you need ordered traversal, consider using Arrays.sort(pq.toArray()).

The only guarantee provided by PriorityQueue is that poll(), peek(), etc return the least element. If you need ordered iteration of elements, use some other collection such as TreeSet.

不如归去 2024-11-09 05:35:01

对于任何想要如何按照顺序迭代队列的人,这可以通过使用 投票删除

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

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

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

For anyone looking how to iterate the queue following the order, this can be achieved by using poll or remove.

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

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

The only diference between poll() and remove(), is that poll returns null when is empty and remove throws a NoSuchElementException.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文