📜  Java中通过Comparator实现PriorityQueue(1)

📅  最后修改于: 2023-12-03 14:42:59.792000             🧑  作者: Mango

Java中通过Comparator实现PriorityQueue

Java中的PriorityQueue是一种基于优先级的非常有用的数据结构。一般情况下,元素被插入到PriorityQueue中的顺序是无关紧要的,取出元素时则按照优先级高低的顺序依次取出。如果元素具有自然排序关系(例如数字按照升序排列),则可以使用Java中自带的实现,否则需要自定义Comparator。

PriorityQueue实现

在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需要实现接口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中的应用非常广泛,掌握其使用方法对于程序员来说是非常重要的。