 有界优先队列 - BoundedPriorityQueue
有界优先队列 - BoundedPriorityQueue
 # 有界优先队列 - BoundedPriorityQueue
 简介
BoundedPriorityQueue 是 Hutool 提供的一个有界优先队列,用于处理在大量数据中获取前 N 个最大或最小元素的场景。与传统优先队列不同,BoundedPriorityQueue 在超出容量时会自动丢弃不符合优先级的元素,从而保证空间利用率。
# 1. 使用场景
假设我们有一个分布式系统,每个数据库实例保存了部分用户信息。我们希望找到这些用户中最热门的前 5 名。通过在每个数据库实例上找出前 5 名,再合并这些部分结果并进行排序,我们可以得到最终的结果。BoundedPriorityQueue 简化了这个过程,只需将数据依次加入队列,队列会自动维护前 5 名元素。
# 2. 主要方法
# 2.1 构造方法
BoundedPriorityQueue 提供了多种构造方式,允许自定义容量、比较器等。
- BoundedPriorityQueue(int capacity):创建一个有界优先队列,使用默认的自然顺序排序。
- BoundedPriorityQueue(int capacity, Comparator<? super T> comparator):创建一个有界优先队列,使用自定义的比较器进行排序。
# 示例:构造有界优先队列
import cn.hutool.core.collection.BoundedPriorityQueue;
import java.util.Comparator;
public class BoundedPriorityQueueExample {
    public static void main(String[] args) {
        // 使用默认的自然顺序,创建容量为 5 的有界优先队列
        BoundedPriorityQueue<Integer> queue = new BoundedPriorityQueue<>(5);
        // 使用自定义比较器,按从大到小排序
        BoundedPriorityQueue<Integer> customQueue = new BoundedPriorityQueue<>(5, Comparator.reverseOrder());
        // 打印队列信息
        System.out.println("默认自然顺序队列: " + queue);
        System.out.println("自定义比较器队列: " + customQueue);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 参数说明: - capacity: 队列的容量,即最多存储多少个元素。
- comparator: 自定义的比较器,用于定义排序规则。如果未指定,使用元素的自然顺序。
 
- 作用:用于初始化队列,定义其容量和排序规则。 
- 实际开发场景:在需要获取大量数据中的前 N 个最大或最小元素时,可以使用此构造方法创建合适的队列。 
# 2.2 添加元素
通过 offer 或 add 方法将元素加入队列。如果队列已满且新元素优先级低于当前队列中的元素,则新元素会被自动丢弃。
# 示例:添加元素并维护队列前 N 名
import cn.hutool.core.collection.BoundedPriorityQueue;
public class BoundedPriorityQueueExample {
    public static void main(String[] args) {
        // 创建一个容量为 5 的有界优先队列,按自然顺序排序
        BoundedPriorityQueue<Integer> queue = new BoundedPriorityQueue<>(5);
        // 定义一个包含 6 个元素的数组
        int[] array = new int[]{5, 7, 9, 2, 3, 8};
        // 依次将元素加入队列
        for (int i : array) {
            queue.offer(i);
        }
        // 打印队列结果,预期为前 5 小的元素
        System.out.println("队列中的前 5 名元素: " + queue);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 方法签名:
- boolean offer(T e):将元素加入队列。
- boolean add(T e):将元素加入队列,功能与- offer相同。
 
- 参数说明:
- e: 需要加入队列的元素。
 
- 返回值:boolean,返回true表示元素成功加入队列,false表示元素被丢弃。
- 作用:用于动态维护队列的前 N 名元素,当队列超出容量时自动丢弃优先级低的元素。
- 实际开发场景:在处理分布式数据时,可以通过多次 offer操作,从多个来源合并前 N 名数据。
# 2.3 转换为 List
 BoundedPriorityQueue 支持将当前队列转换为 List,以便进一步操作。
# 示例:将队列转换为列表
import cn.hutool.core.collection.BoundedPriorityQueue;
import java.util.List;
public class BoundedPriorityQueueExample {
    public static void main(String[] args) {
        // 创建一个容量为 5 的有界优先队列
        BoundedPriorityQueue<Integer> queue = new BoundedPriorityQueue<>(5);
        // 添加元素
        int[] array = new int[]{5, 7, 9, 2, 3, 8};
        for (int i : array) {
            queue.offer(i);
        }
        // 将队列转换为列表
        List<Integer> list = queue.toList();
        // 打印列表结果
        System.out.println("转换为列表后的结果: " + list);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 方法签名:List<T> toList()
- 参数说明:无参数。
- 返回值:List<T>,返回当前队列中的元素列表。
- 作用:将优先队列转换为 List,便于进行排序、遍历等操作。
- 实际开发场景:在获取到前 N 名数据后,可以将队列转换为列表进行进一步处理或输出。
# 3. 实际应用场景
- 多源数据合并排序:在分布式系统中,处理来自多个数据源的结果并取出前 N 名。
- 大规模数据筛选:在处理大数据时,通过 BoundedPriorityQueue高效筛选出符合条件的前 N 名数据,减少内存消耗。
- 实时流式计算:在流式数据处理中,通过有界优先队列实时维护最重要的前 N 名元素。
编辑此页  (opens new window)
  上次更新: 2024/12/28, 18:32:08
