PriorityQueue这种数据结构支持按照优先级取出里面的元素。这是和其它常用数据结构,比如 ArrayList, Queue, Stack等最大的区别。因为要支持优先级,而heap具有类似的结构,所以,PriorityQueue一般都是基于HEAP实现的。(也可以用其它数据结构实现,但是各种复杂度会有不同。)
基于HEAP实现的PriorityQueue复杂度分析:
add(E e): O(lg n)
poll(): O(lg n) (注意,取出元素只需要O(1), 但是维护HEAP结构需要 O(lg n))
remove(E e): O(n)
下面例子是用Priority Queue保存学生信息,学生类含有姓名和成绩,当把学生保存在Priority Queue里时,成绩最低的学生放在最前面。如果想把成绩最高的放在最前面,只要把compare方法改成 return s2.grade - s1.grade; 即可。
- import java.util.Comparator;
- import java.util.PriorityQueue;
- import java.util.Random;
- public class PriorityQueueTutorial{
- public static void main(String args[]){
- PriorityQueue<Student> queue = new PriorityQueue<Student>(11,
- new Comparator<Student>() {
- public int compare(Student s1, Student s2) {
- return s1.grade - s2.grade;
- }
- });
- for (int i = 1; i <= 100; i++) {
- queue.add(new Student("s" + i, (new Random().nextInt(1000))));
- }
- while (!queue.isEmpty()) {
- System.out.println(queue.poll().toString());
- }
- }
- }
- class Student {
- String name;
- int grade;
- public Student(String name, int grade)
- {
- this.name = name;
- this.grade = grade;
- }
- public String toString() {
- return name + " " + grade;
- }
- }