排序PriorityQueue

我遇到了PriorityQueues的问题,因为我认为它优先命令,但我不确定优先级是什么(我的意思是价值是什么以及它来自哪里)。 可以使用构造函数中的比较器创建priorityQueue,我已经尝试过但它不起作用。

队列类:

public JavaPriorityFlightQueue() { super(); flights = new PriorityQueue(5, new SortQueueViaPriority()); } 

比较:

 import java.util.Comparator; public class SortQueueViaPriority implements Comparator { public int compare(Object o1, Object o2){ Flight f1 = (Flight) o1; Flight f2 = (Flight) o2; if( f1 == null || f2 == null ){ if( f1 == f2 ) return 0; else if( f2 == null) return +1; else return -1; } Integer i1 = (Integer) f1.getPriority(); Integer i2 = (Integer) f2.getPriority(); return i2.compareTo(i1); } } 

优先级是一个int值,它是航class类的一部分。 我测试一下。

 JavaPriorityFlightQueue flightQueue = new JavaPriorityFlightQueue(); Flight flight1 = new Flight("0001",9); Flight flight2 = new Flight("0002",7); Flight flight3 = new Flight("0003",1); Flight flight4 = new Flight("0004",2); Flight flight5 = new Flight("0005",1); 

但是,PriorityQueue没有排序,当我检查它时,值9永远不会与任何东西进行比较,结果是没有任何排序。 比较类SortQueueViaPriority是从类完美排序的另一个类复制和粘贴的。

我建议你尝试下面的例子。 如果使用PriorityQueue作为队列,则会按顺序删除条目。

 import java.util.Comparator; import java.util.PriorityQueue; public class Main { public static void main(String... args) { PriorityQueue flights = new PriorityQueue(5, new SortQueueViaPriority()); flights.add(new Flight("0001", 9)); flights.add(new Flight("0002", 7)); flights.add(new Flight("0003", 1)); flights.add(new Flight("0004", 2)); flights.add(new Flight("0005", 1)); while (!flights.isEmpty()) System.out.println(flights.remove()); } } class SortQueueViaPriority implements Comparator { @Override public int compare(Flight f1, Flight f2) { return Integer.compare(f2.getPriority(), f1.getPriority()); } } class Flight { private final String name; private final int priority; Flight(String name, int priority) { this.name = name; this.priority = priority; } public int getPriority() { return priority; } @Override public String toString() { return "Flight{" + "name='" + name + '\'' + ", priority=" + priority + '}'; } } 

版画

 Flight{name='0001', priority=9} Flight{name='0002', priority=7} Flight{name='0004', priority=2} Flight{name='0003', priority=1} Flight{name='0005', priority=1} 

注意:PriorityQueue对条目进行排序,使得只有第一个元素才是最小的。 如果您遍历队列,您将看到所有元素,但它们可能是顺序也可能不是。

问题是Iterator 。正如在Java doc of PriorityQueue#iterator记录的那样

返回此队列中元素的迭代器。 迭代器不会以任何特定顺序返回元素。

由于toString使用迭代器,它不会按顺序打印。 或者,如果您使用基于迭代器的循环,那么它也将按顺序排列。

并在PriorityQueue的Java doc中

队列检索操作轮询,删除,查看和元素访问队列头部的元素。

要按顺序获得结果,您必须使用这些方法之一。

而不是Comparator只使用Comparable接口。

您的Flight类应该实现Comparable接口。 然后,您需要覆盖compareTo()方法。 在该方法中,您可以根据所需的属性添加自己的逻辑进行排序。

就像这样:

 @Override public int compareTo(Object obj) { // TODO Auto-generated method stub Flight f = (Flight)obj; if(this.a