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