Java 使用PriorityQueue来进行数据的分类收集
Java util包有一个队列接口,定义了队列接口,该接口有为队列中的方法定义的方法。队列的一般实现是元素的先入先出排序。该接口有许多方法,我们主要关注两个方法
- poll() – 检索并删除该队列的头部,如果该队列为空,则返回null。
- offer(element e) – 如果有可能在不违反容量限制的情况下立即插入指定的元素到这个队列中。
队列接口有许多实现。对于队列内的特殊排序,java引入了一个实现类Priority_Queue,允许队列内的排序为特殊类型。
Priority Queue
一个基于优先级堆的无界优先级队列。优先级队列的元素根据它们的自然排序,或者根据队列构造时提供的比较器进行排序,这取决于使用哪个构造器。一个优先级队列不允许有空元素。依靠自然排序的优先级队列也不允许插入不可比较的对象(这样做可能导致ClassCastException)。
使用优先队列对元素进行排序
让我们通过一些代码例子来了解如何使用优先级队列来按升序或降序排列元素。
1.在优先级队列中按升序排序的元素
一个比较器类允许我们定义元素在队列中的排序方式。为了对元素进行升序排序,我们需要对队列做如下定义。(为了简单起见,比较器被写成了一个扩展的形式)。
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
public class Application {
public static void main(String[] args) {
Comparator<Integer> ascendingOrderComparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 < o2)
return -1;
if (o1 == o2)
return 0;
return 1;
}
};
Queue<Integer> priorityQueue = new PriorityQueue<>(ascendingOrderComparator);
// insert elements in the queue
priorityQueue.offer(5);
priorityQueue.offer(100);
priorityQueue.offer(1);
priorityQueue.offer(2);
// output
while (!priorityQueue.isEmpty()) {
System.out.print(priorityQueue.poll() + " ");
}
}
}
输出
1 2 5 100
2.在优先级队列中按降序排序的元素
一个比较器类允许我们定义元素在队列中的排序方式。为了对元素进行降序排序,我们需要对队列做如下定义。(为了简单起见,比较器被写成了一个扩展的形式)。
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
public class Application {
public static void main(String[] args) {
Comparator<Integer> descendingOrderComparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 < o2)
return 1;
if (o1 == o2)
return 0;
return -1;
}
};
Queue<Integer> priorityQueue = new PriorityQueue<>(descendingOrderComparator);
// insert elements in the queue
priorityQueue.offer(5);
priorityQueue.offer(100);
priorityQueue.offer(1);
priorityQueue.offer(2);
// output
while (!priorityQueue.isEmpty()) {
System.out.print(priorityQueue.poll() + " ");
}
}
}
输出
100 5 2 1
3.使用优先级队列对一个对象集合进行排序
我们可以根据对象的某个字段对一个对象集合进行排序。让我们以Person类为例,它可以根据人的年龄以升序进行排序
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
public class Application {
public static void main(String[] args) {
Comparator<Person> ascendingOrderComparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
if (o1.getAge() < o2.getAge())
return -1;
if (o1.getAge() == o2.getAge())
return 0;
return 1;
}
};
Queue<Person> priorityQueue = new PriorityQueue<>(ascendingOrderComparator);
// insert elements in the queue
priorityQueue.offer(new Person("john", "doe", 5));
priorityQueue.offer(new Person("karan", "agarwal", 100));
priorityQueue.offer(new Person("anon", "test", 1));
priorityQueue.offer(new Person("jien", "wang", 2));
// output
while (!priorityQueue.isEmpty()) {
System.out.print(priorityQueue.poll() + " ");
}
}
}
class Person {
private String firstName;
private String lastName;
private int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", age=" + age +
'}';
}
}
输出
Person{firstName='anon', lastName='test', age=1}
Person{firstName='jien', lastName='wang', age=2}
Person{firstName='john', lastName='doe', age=5}
Person{firstName='karan', lastName='agarwal', age=100}