Java:比较器总是返回1不会使优先级队列进入队列?

Sea*_*ean 4 java priority-queue comparator

可能重复:
Java:从优先级队列中排队的奇怪顺序

我厌倦了通过实现以下比较器将优先级队列转换为队列:

  • Hack:QueueComparator使PriorityQueue的行为类似于队列(FIFO),总是返回1
  • 由于优先级队列的"自然排序"在头部具有最少的元素,并且当第一个小于第二个时常规比较器返回-1,因此被黑客比较器总是返回1以便放置当前(最后)方块在尾部(递归)

这是代码:

import java.util.Comparator;
public class QueueComparator implements Comparator<Square>{
    public int compare(Square square1, Square square2)
    {
        return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是由此产生的"队列"并没有保持秩序(FIFO).为什么?

Jen*_*der 9

问题是为什么要这样?

首先,你的比较器完全坏了,因为它违反了基本约束条件

sign(compare(a,b)) = - sign(compare(b,a))
Run Code Online (Sandbox Code Playgroud)

compare(a,a) == 0
Run Code Online (Sandbox Code Playgroud)

因此,使用它的任何东西都可能会产生各种结果,例如丢失条目,在无限循环中运行,抛出堆栈溢出......

如果你想实现IDontGiveAShitComparator它,它应该一直返回0.取决于比较器的一切应该能够处理.

什么订单结果仍然取决于实施.如果它将元素存储在列表中FIFO或LIFO是可能的,如果它存储在平衡树中,它可能总是在一侧添加元素,导致树的重新平衡,这将几乎混合一切.

也许它使用基于哈希的东西,在这种情况下,所有具有相同优先级的元素可能会按其哈希值排序.