📅  最后修改于: 2023-12-03 14:42:59.792000             🧑  作者: Mango
Java中的PriorityQueue是一种基于优先级的非常有用的数据结构。一般情况下,元素被插入到PriorityQueue中的顺序是无关紧要的,取出元素时则按照优先级高低的顺序依次取出。如果元素具有自然排序关系(例如数字按照升序排列),则可以使用Java中自带的实现,否则需要自定义Comparator。
在Java中,我们可以使用PriorityQueue实现优先队列。PriorityQueue是一种用来存放元素的队列,它根据元素的自然顺序或者是构造时提供的Comparator(比较器)与其他元素进行比较,以决定当前元素在队列中的优先级。示例代码如下:
PriorityQueue<Integer> pq = new PriorityQueue<>(); // 默认是小根堆
// 将元素插入优先队列中
pq.offer(2);
pq.offer(1);
pq.offer(4);
pq.offer(3);
// 依次取出元素并输出
while (!pq.isEmpty()) {
System.out.println(pq.poll()); // 输出 1 2 3 4
}
如果元素并不具有自然排序关系,或者我们想按照其他规则进行排序,则需要使用自定义的Comparator。自定义Comparator需要实现接口Comparator,并重写其中的compare方法,示例代码如下:
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
// 自定义Comparator,按照年龄升序排列
class AgeComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
return s1.age - s2.age;
}
}
PriorityQueue<Student> pq = new PriorityQueue<>(new AgeComparator()); // 初始化时指定Comparator
// 将元素插入优先队列中
pq.offer(new Student("小明", 18));
pq.offer(new Student("小红", 20));
pq.offer(new Student("小刚", 15));
// 依次取出元素并输出
while (!pq.isEmpty()) {
Student stu = pq.poll();
System.out.println(stu.name + ":" + stu.age);
}
// 输出 小刚:15 小明:18 小红:20
在上面的示例代码中,我们定义了一个Student类,并按照年龄升序排列进行排序。在初始化PriorityQueue时,我们需要传入自定义的Comparator。元素插入后,由于我们传入了Comparator,因此在取出元素时会按照我们定义的规则进行排序。
通过本文,我们了解了Java中如何使用PriorityQueue实现基于优先级的队列,并且学会了如何通过自定义Comparator对元素进行排序。PriorityQueue在Java中的应用非常广泛,掌握其使用方法对于程序员来说是非常重要的。