Java 最小优先级队列和最大优先级队列排序不正确

Java 最小优先级队列和最大优先级队列排序不正确,java,priority-queue,Java,Priority Queue,我正在编写一个最小优先级队列和一个最大优先级队列,如下所示: PriorityQueue<Double> max_pq = new PriorityQueue<>(new Comparator<Double>() { @Override public int compare(Double o1, Double o2) { if(o1<o2) return +1;

我正在编写一个最小优先级队列和一个最大优先级队列,如下所示:

PriorityQueue<Double> max_pq = new PriorityQueue<>(new Comparator<Double>() {
            @Override
            public int compare(Double o1, Double o2) {
                if(o1<o2) return +1;
                if(o1.equals(o2)) return 0;
                return -1;
            }
        });

        PriorityQueue<Double> min_pq = new PriorityQueue<>(new Comparator<Double>() {
            @Override
            public int compare(Double o1, Double o2) {
                if(o1>o2) return +1;
                if(o1.equals(o2)) return 0;
                return -1;
            }
        });
PriorityQueue max\u pq=new PriorityQueue(new Comparator(){
@凌驾
公共整数比较(双o1,双o2){
如果(o1o2)返回+1;
如果(o1等于(o2))返回0;
返回-1;
}
});
将输入数组的编号逐个添加到队列中。然而,当数组[12,4,5,3,8,7]为样本输入且打印优先级队列的输出为:

最小值:[3.0,4.0,5.0,12.0,8.0,7.0] 最大值:[12.0,8.0,7.0,3.0,4.0,5.0]


我定义的比较器有什么问题吗?提前感谢您的帮助。

当您迭代
PriorityQueue
的元素时,这些元素没有完全排序。唯一可以确定的是,
PriorityQueue
将强制执行最小的最大的元素分别是
minu-pq
max-pq
优先级队列的第一个元素

从javadocs:

此队列的头是相对于队列的最小元素 指定顺序

基于此假设,如果使用方法
poll()
,则可以按顺序打印:

投票方式:

检索并删除此队列的头,如果 队列为空

对于比较
Double
s,应使用方法
Double.compare(o1,o2)
。此外,您可以使用lambda和方法引用简化比较器,即代替:

PriorityQueue<Double> max_pq = new PriorityQueue<>(new Comparator<Double>() {
            @Override
            public int compare(Double o1, Double o2) {
                if(o1<o2) return +1;
                if(o1.equals(o2)) return 0;
                return -1;
            }
        });

        PriorityQueue<Double> min_pq = new PriorityQueue<>(new Comparator<Double>() {
            @Override
            public int compare(Double o1, Double o2) {
                if(o1>o2) return +1;
                if(o1.equals(o2)) return 0;
                return -1;
            }
        });
TreeSet
的另一个好处是它与方法
downingset()
一起提供。因此,您不需要保留两个数据结构来同时保持
min
max
顺序,您只需要:

  TreeSet<Double> max_pq = new TreeSet<>(Double::compareTo);
   
  max_pq.forEach(System.out::println);
  max_pq.descendingSet().forEach(System.out::println); 
TreeSet max_pq=新的TreeSet(双重::比较);
最大pq.forEach(系统输出::打印项次);
max_pq.downingset().forEach(System.out::println);
PriorityQueue<Double> max_pq = new PriorityQueue<>(Double::compareTo);
PriorityQueue<Double> min_pq = new PriorityQueue<>((o1, o2) -> Double.compare(o2, o1));
TreeSet<Double> max_pq = new TreeSet<>(Double::compareTo);
  TreeSet<Double> max_pq = new TreeSet<>(Double::compareTo);
   
  max_pq.forEach(System.out::println);
  max_pq.descendingSet().forEach(System.out::println);