PriorityQueue类
PriorityQueue类
Java中的PriorityQueue
是一个基于优先级堆的无界优先级队列。它是一个队列,可以按照元素的优先级顺序对元素进行排序,并且允许快速访问具有最高优先级的元素。它实现了Queue
接口,继承了AbstractQueue
类。
主要函数和方法:
-
构造函数:
PriorityQueue() // 创建一个初始容量为11的优先级队列,默认自然顺序排序 PriorityQueue(int initialCapacity) // 创建具有指定初始容量的优先级队列,默认自然顺序排序 PriorityQueue(Collection<? extends E> c) // 创建包含指定集合元素的优先级队列,默认自然顺序排序 PriorityQueue(int initialCapacity, Comparator<? super E> comparator) // 创建具有指定初始容量和比较器的优先级队列
-
核心方法:
add(E e)
或offer(E e)
:将指定的元素插入队列。peek()
:返回队列的头部(最高优先级元素),如果队列为空,则返回null
。poll()
:移除并返回队列的头部(最高优先级元素),如果队列为空,则返回null
。remove(Object o)
:从队列中移除指定的元素,如果存在的话。clear()
:移除队列中的所有元素。size()
:返回队列中的元素数量。isEmpty()
:检查队列是否为空。iterator()
:返回一个迭代器,可以按照元素的顺序遍历队列。
使用示例:
-
使用默认自然排序:
PriorityQueue<Integer> pq = new PriorityQueue<>(); pq.offer(5); pq.offer(2); pq.offer(8); pq.offer(1); // 遍历队列并按优先级顺序访问元素 while (!pq.isEmpty()) { System.out.println(pq.poll()); }
-
使用自定义比较器排序:
// 自定义一个比较器,以字符串长度作为优先级排序 Comparator<String> lengthComparator = Comparator.comparingInt(String::length); PriorityQueue<String> pq = new PriorityQueue<>(lengthComparator); pq.offer("apple"); pq.offer("banana"); pq.offer("orange"); pq.offer("kiwi"); // 遍历队列并按长度顺序访问元素 while (!pq.isEmpty()) { System.out.println(pq.poll()); }
PriorityQueue
可以用于实现任务调度、事件处理等场景,能够方便地处理具有优先级的元素集合。在使用过程中需要注意比较器的实现,确保元素能够按照预期的优先级排序。
Comparator.comparingInt(String::length)
创建了一个比较器,根据字符串的长度进行比较。这个比较器是按照长度来确定优先级的,所以较长的字符串会被认为是“更大”的(更高优先级),排在前面。
这是因为在标准的升序排序中,较大的元素(在这种情况下是指长度更长的字符串)会排在较小的元素前面。这符合通常的自然排序规则。所以,当你使用Comparator.comparingInt(String::length)
创建的比较器时,它将会把字符串长度较长的排在前面。
如果你想要反转这种顺序,即短的字符串优先级高,你可以使用 reversed()
方法来反转比较器的顺序。例如:
Comparator<String> lengthComparator = Comparator.comparingInt(String::length).reversed();
通过调用 reversed()
方法,你可以修改比较器的排序顺序,使较短的字符串排在前面,从而改变优先级的顺序。