PriorityQueue类

PriorityQueue类

Java中的PriorityQueue是一个基于优先级堆的无界优先级队列。它是一个队列,可以按照元素的优先级顺序对元素进行排序,并且允许快速访问具有最高优先级的元素。它实现了Queue接口,继承了AbstractQueue类。

主要函数和方法:

  1. 构造函数:

    PriorityQueue() // 创建一个初始容量为11的优先级队列,默认自然顺序排序
    PriorityQueue(int initialCapacity) // 创建具有指定初始容量的优先级队列,默认自然顺序排序
    PriorityQueue(Collection<? extends E> c) // 创建包含指定集合元素的优先级队列,默认自然顺序排序
    PriorityQueue(int initialCapacity, Comparator<? super E> comparator) // 创建具有指定初始容量和比较器的优先级队列
    
  2. 核心方法:

    • add(E e)offer(E e):将指定的元素插入队列。
    • peek():返回队列的头部(最高优先级元素),如果队列为空,则返回 null
    • poll():移除并返回队列的头部(最高优先级元素),如果队列为空,则返回 null
    • remove(Object o):从队列中移除指定的元素,如果存在的话。
    • clear():移除队列中的所有元素。
    • size():返回队列中的元素数量。
    • isEmpty():检查队列是否为空。
    • iterator():返回一个迭代器,可以按照元素的顺序遍历队列。

使用示例:

  1. 使用默认自然排序:

    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());
    }
    
  2. 使用自定义比较器排序:

    // 自定义一个比较器,以字符串长度作为优先级排序
    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() 方法,你可以修改比较器的排序顺序,使较短的字符串排在前面,从而改变优先级的顺序。

你可能感兴趣的:(开发语言,java)