PriorityQueue():小根堆大根堆


定义

  • 优先队列PriorityQueue是Queue接口的实现,可以对其中元素进行排序。

  • 优先队列中元素默认排列顺序是升序排列,即小根堆。

  • 根据实践,默认情况的排序,如果只是打印整个队列,拿只针对队头元素。如果是poll(),则会按照升序(小根堆)推出。

  • 若要实现整个队列的升序或者降序,需要定义比较器Comparator

    public static void main(String[] args) {
        PriorityQueue queue = new PriorityQueue<>();
        queue.offer(8);
        queue.offer(3);
        queue.offer(2);
        System.out.println(queue);  //输出[2,8,3]
        while (!queue.isEmpty()){
            System.out.println(queue.poll());  //输出2,3,8
        }
    }
    

定义小根堆:

PriorityQueue queue = new PriorityQueue<>(); //小根堆

定义大根堆:

PriorityQueue queue = new PriorityQueue<>((o1, o2) -> (o2 - o1));  //大根堆

比较器

(o1, o2) -> (o2 - o1)  //实际就是一个简易的【降序】比较器

定义升序和降序比较器:

// 升序(小根堆)
static Comparator cmp1 = new Comparator() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1-o2;
    }
};
// 降序(大根堆)
static Comparator cmp2 = new Comparator() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2-o1;
    }
};

// 例如,定义大根堆:
PriorityQueue queue = new PriorityQueue<>(cmp2);