可能重复:
Java:从优先级队列生成奇怪的队列顺序
我尝试通过实现以下比较器将优先级队列转换为队列:
以下是代码:
import java.util.Comparator;
public class QueueComparator implements Comparator<Square>{
public int compare(Square square1, Square square2)
{
return 1;
}
}
但由此产生的“队列”并不能使事情保持有序(FIFO)。为什么?
compareTo(a,b)
通常应该返回——compare(b,a)
,而compareTo(a,a)
应该返回零。你的比较器违反了这两条规则。
查看Javadoc。
嗯,这是一个黑客。所以如果它不起作用,我不会太惊讶。
PriorityQueue的Javadoc表示:
这个队列的头是相对于指定排序的最小元素。如果多个元素以最小值绑定,头就是其中一个元素——绑定被任意断开。
好了,给你。如果您的比较器为所有元素对返回相同的值,那么您只有联系。因此,队列顺序确实是任意的。
问题是为什么要这样做?
首先,您的比较器完全损坏,因为它违反了基本约束
sign(compare(a,b)) = - sign(compare(b,a))
和
compare(a,a) == 0
所以任何使用它的东西都可能会产生各种各样的结果,比如丢失条目,在无休止的循环中运行,抛出堆栈溢出。。。
如果您想实现一个IDontGiveAShitCompator
,它应该始终返回0。一切取决于一个比较器应该能够处理。
订单结果如何仍取决于实施情况。如果它在一个列表中存储元素,FIFO或LIFO是可能的,如果它存储在一个平衡的树中,它可能会始终在一侧添加元素,导致树的重新平衡,这几乎会混淆所有内容。
也许它使用基于哈希的东西,在这种情况下,具有相同优先级的所有元素可能会按其哈希值排序。
假设我实现了一个HashMap,其中字符被分配了一个值的ArrayList。 我已经在HashMap中创建了这些字符的PriorityQueue,但我希望能够根据此优先级删除这些字符: {a,b,c} {a,b}删除c,因为它的ArrayList中包含一个值,该值决定必须首先删除它。 对此最好的方法是什么?
有人能解释一下这里使用的比较运算符的语法吗?它是做什么的
priority_queue,comparator(query,d)>min_heap; main.cpp:20:7:注意:“comparator”不是文字,因为: class comparator{ main.cpp:20:7:注意:“comparator”不是聚合,没有普通的默认构造函数,也没有不是复制或移动构造函数的constexpr构造函数 Main.cpp:92:65:注意:应为类型,但
我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。
我在Java使用PriorityQueue。 我有一个结构如下的对象: 优先考虑的是从最便宜到最贵的成本: 我使用add将对象包含在队列中。 它适用于队列中的每个元素,但我添加的最后一个元素总是位于底部。 我做错了什么?
问题内容: 在Python文档中, 最低值的条目首先被检索(最低值的条目是由返回的条目)。条目的典型模式是形式为的元组。 看来队列将按优先级排序,然后按数据排序,这可能并不总是正确的。假设数据“项目2”在“项目1”之前入队,则项目1仍将排在第一位。在另一个文档页面heapq中,它建议使用计数器。所以我将数据存储为。是否没有类似的东西 那我就不需要自己执行订购吗? 问题答案: 据我所知,您要找的东西