如何创建PriorityQueue数组并为每个队列指定自定义比较器?
问题分析与解决方案
你的代码存在两个核心问题
- 泛型与类型不匹配:
- 匿名
Comparator使用了菱形运算符<>,编译器无法推断出正确的泛型类型,导致要求你重写原始的compare(Object, Object)方法,而非你定义的int[]参数版本。 - 你的队列声明是
PriorityQueue<long[]>,但compare方法的参数写成了int[],类型完全不匹配,应该改为long[]。
- 匿名
- Arrays.fill的逻辑错误:
Arrays.fill会把数组所有元素赋值为同一个PriorityQueue实例,也就是说数组里的10个元素其实都是指向同一个队列的引用,后续操作任何一个队列都会影响所有,这完全违背了“每个队列独立”的需求。
正确的实现方式
方式1:循环初始化(直观易懂)
通过循环为数组每个位置创建独立的PriorityQueue实例,同时修正Comparator的类型问题,并且用Long.compare避免long类型溢出问题:
import java.util.*; public class Main { public static void main(String[] args) { PriorityQueue<long[]>[] arr = new PriorityQueue[10]; for (int i = 0; i < arr.length; i++) { // 使用lambda简化Comparator写法 arr[i] = new PriorityQueue<>((a, b) -> Long.compare(b[1], a[1])); } } }
方式2:用Arrays.setAll(简洁的函数式写法)
利用Arrays.setAll遍历数组,为每个索引创建新的队列实例,代码更简洁:
import java.util.*; public class Main { public static void main(String[] args) { PriorityQueue<long[]>[] arr = new PriorityQueue[10]; Arrays.setAll(arr, index -> new PriorityQueue<>((a, b) -> Long.compare(b[1], a[1]))); } }
注意:不要直接用
b[1] - a[1]来比较long类型,当两个long值的差值超过int范围时会发生溢出,导致排序逻辑错误,必须用Long.compare方法来做安全的比较。
内容的提问来源于stack exchange,提问作者Ayush Tiwari
相关产品推荐
相关产品推荐

