Руководство по PriorityQueue

Исходная ссылка: https://blog.csdn.net/ohwang/article/details/116934308 .


PriorityQueue также называется приоритетной очередью.


Примечание 1:
PriorityQueue реализован с использованием массива. Размер массива можно увеличивать динамически, а емкость не ограничена.
Очередь приоритетов использует сортировку кучи (по умолчанию — минимальная куча). Сортировка кучи может гарантировать только то, что корень будет самым большим (наименьшим), а вся куча не будет упорядочена.

Примечание 2:
Не потокобезопасно. Доступна безопасность резьбы PriorityBlockingQueue.

Примечание 3. Этот элемент
не разрешен null.

Примечание 4:
offer(), poll(), remove(), add()временная сложность O(log(n)).
remove(Object)и contains(Object)временная сложность O(n).
peek, element, sizeвременная сложность O(常量).

Примечание 5. Итератор, предоставленный в
методе, не гарантирует, что элементы в приоритетной очереди будут пройдены упорядоченным образом. Доступно, если вам нужно пройти по порядку .iterator()
Arrays.sort(pq.toArray())

Примечание 6. Вы можете указать способ сортировки в конструкторе.

# 默认的初始容量(11)
PriorityQueue(int initialCapacity)
# 使用指定的初始容量创建一个 PriorityQueue,并根据其自然顺序来排序其元素。

PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
# 使用指定的初始容量创建一个 PriorityQueue,并根据指定的比较器comparator来排序其元素。

Примечание 7. Этот класс и его итераторы реализуют все дополнительные методы интерфейсов Collection и Iterator.


# 默认升序
PriorityQueue<Integer> queue2 = new PriorityQueue<>(10);
queue2.offer(11);
queue2.offer(9);
int len = queue2.size();
for (int i = 0; i < len; i++) {
    
    
    System.out.println(queue2.poll());
}
//输出 9 11

# 自定义降序
PriorityQueue<Integer> queue = new PriorityQueue<>(10, (a, b) -> b - a);
queue.offer(13);
queue.offer(9);
int len1 = queue.size();
for (int i = 0; i < len1; i++) {
    
    
    System.out.println(queue.poll());
}
//输出 13 9
# 模拟业务使用
PriorityQueue<People> queue = new PriorityQueue<>(11, (p1, p2) -> p2.age - p1.age);
for (int i = 1; i <= 10; i++) {
    
    
    queue.add(new People("张" + i, (new Random().nextInt(100))));
}
while (!queue.isEmpty()) {
    
    
    System.out.println(queue.poll().toString());
}

class People {
    
    
    String name;
    int age;
    public People(String name, int age) {
    
    
        this.name = name;
        this.age = age;
    }
    public String toString() {
    
    
        return "姓名:" + name + " 年龄:" + age;
    }
}

姓名:张9 年龄:67
姓名:张1 年龄:66
姓名:张8 年龄:65
姓名:张7 年龄:54
姓名:张4 年龄:48
姓名:张2 年龄:41
姓名:张5 年龄:39
姓名:张3 年龄:26
姓名:张6 年龄:11
姓名:张10 年龄:0

Guess you like

Origin blog.csdn.net/weixin_37646636/article/details/132768781