Java优先级队列是如何工作的?

发布于 2024-08-12 00:50:00 字数 445 浏览 5 评论 0原文

简而言之,我正在实现一个图表,现​​在我正在研究 Kruskal,我需要一个优先级队列。我对优先级队列的定义是具有最小键的元素将排在第一位?这是错误的吗?因为当我在队列中插入加权边(或数字)时,它们最终不会被排序。

PriorityQueue<Integer> tja = new PriorityQueue<Integer>(); 
tja.add(55);
tja.add(99); 
tja.add(1); 
tja.add(102);
tja.add(54);
tja.add(51);
System.out.println(tja);

那会打印出这个; [1、54、51、102、99、55]。这没有像我想要的那样排序!是的,我做了一个比较器,它进入优先级队列,从边缘对象中提取数字并基于该 int 进行比较。所以这应该可行,或者我完全误解了这个数据结构如何工作的整个概念?

Short story, I'm implementing a graph and now I'm working on the Kruskal, I need a priority queue. My definition of a priority queue is that the element with the smallest key would come first? Is this wrong? Because when I insert the weighted edges(or numbers) in the queue they don't end up sorted.

PriorityQueue<Integer> tja = new PriorityQueue<Integer>(); 
tja.add(55);
tja.add(99); 
tja.add(1); 
tja.add(102);
tja.add(54);
tja.add(51);
System.out.println(tja);

That would print out this; [1, 54, 51, 102, 99, 55]. This is not sorted like I want them to be! And yes I made a comperator that goes into the priority queue that extracts the number from the edge object and compares based on that int. So this should work, or have I just completely misunderstood the entire concept of how this data structure works?

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

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

发布评论

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

评论(3

万劫不复 2024-08-19 00:50:00

System.out.println 正在调用 toString() 方法,该方法使用迭代器,不能保证遵循自然顺序。从文档:“迭代器提供在方法 iterator() 不保证以任何特定顺序遍历优先级队列的元素。”

System.out.println is invoking the toString() method, which is using the iterator, which is not guaranteed to respect the natural ordering. From the docs: "The Iterator provided in method iterator() is not guaranteed to traverse the elements of the priority queue in any particular order."

铁轨上的流浪者 2024-08-19 00:50:00

我没有 Java 中的 PriorityQueue 经验,但看起来优先级没有集成到 iterator()toString() (它使用迭代器())。

如果您这样做:

    while (tja.size()>0)
        System.out.println(tja.remove());

您会得到正确的结果。

I have no experience with PriorityQueue in Java but it looks like the priority thing is not integrated into iterator() or toString() (which uses iterator()).

If you do:

    while (tja.size()>0)
        System.out.println(tja.remove());

You get the proper results.

玩套路吗 2024-08-19 00:50:00

您熟悉二进制堆的功能吗?如果没有,请检查最小堆和最大堆结构。 PriorityQueue 是在堆上实现的。
PriorityQueue 不会按升序对项目进行排序,但会对其进行堆排序。

浏览链接:优先级队列

你得到的输出是正确的。

Are you familiar with functioning of Binary heaps? If not please go through min heap and max heap structures. PriorityQueue is implemented on heaps.
PriorityQueue doesn't sort the items in increasing order, but it does the heap sort on it.

Go through the link: Priority Queue

The output you get is correct.

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