You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建PriorityQueue数组并为每个队列指定自定义比较器?

问题分析与解决方案

你的代码存在两个核心问题

  • 泛型与类型不匹配:
    1. 匿名Comparator使用了菱形运算符<>,编译器无法推断出正确的泛型类型,导致要求你重写原始的compare(Object, Object)方法,而非你定义的int[]参数版本。
    2. 你的队列声明是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:45:21