优先级队列不按照比较器的顺序工作。
输出: [蒂姆,5],[乔,12],[爱丽丝,7]
预期: [蒂姆,5],[爱丽丝,7],[乔,12]
任何人都可以帮助我为什么比较器没有给出预期的输出。
答案 0 :(得分:0)
来自Java docs:
方法
PriorityQueue.iterator()
中提供的迭代器不是 保证遍历任何优先级队列的元素 特别的顺序。如果您需要有序遍历,请考虑使用Arrays.sort(pq.toArray())
答案 1 :(得分:0)
PriorityQueue是一个队列,它不会动态对值进行排序。您需要使用PriorityQueue.poll方法按顺序获取对象。
static class Student {
String name;
int roll;
public Student(String name, int roll) {
this.name = name;
this.roll = roll;
}
@Override
public String toString() {
return "["+ name +","+roll+"]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRoll() {
return roll;
}
public void setRoll(int roll) {
this.roll = roll;
}
}
public static void main(String[] args) {
Comparator<Student> byRoll = Comparator.comparing(Student::getRoll);
PriorityQueue<Student> pq = new PriorityQueue<>(byRoll);
pq.add(new Student("Tim", 5));
pq.add(new Student("Joe", 12));
pq.add(new Student("Alice", 7));
while(!pq.isEmpty()) {
System.out.println( pq.poll().toString());
}
}
答案 2 :(得分:0)
您的代码非常好,无需更改Comparator或Array.sort或添加getter / setter等。 只需更改您的打印声明如下:
while(!pq.isEmpty()) {
System.out.println(pq.poll().toString());
}
希望这有帮助。