如何在嵌套PriorityQueue的ArrayList构造中实现Comparator?
问题分析与解决方案
你的错误在于把用于PriorityQueue的排序逻辑传给了ArrayList的构造函数——ArrayList作为动态数组本身没有内置排序规则,也不接受这类Comparator参数。排序逻辑应该定义在每个PriorityQueue的初始化过程中,因为是每个优先级队列需要按指定规则排序。
正确实现代码
基础实现
先初始化ArrayList,再逐个添加带有指定Comparator的PriorityQueue:
// 初始化空的ArrayList ArrayList<PriorityQueue<Integer[]>> p = new ArrayList<>(); // 向ArrayList中添加按数组第三个元素(索引2)排序的PriorityQueue p.add(new PriorityQueue<>((o1, o2) -> o1[2] - o2[2]));
批量创建多个队列
如果需要创建多个符合要求的PriorityQueue,可以用循环批量添加:
ArrayList<PriorityQueue<Integer[]>> p = new ArrayList<>(); int queueNum = 3; // 要创建的队列数量 for (int i = 0; i < queueNum; i++) { // 每个队列都使用相同的排序规则:按Integer[]索引2的元素升序排序 PriorityQueue<Integer[]> queue = new PriorityQueue<>((o1, o2) -> o1[2] - o2[2]); p.add(queue); }
可选:空值安全的Comparator
如果需要避免数组为空、长度不足或元素为空的异常,可以扩展Comparator逻辑:
p.add(new PriorityQueue<>((o1, o2) -> { if (o1 == null || o2 == null) { // 自定义空值处理,比如把空数组放在队列末尾 return o1 == null ? 1 : -1; } // 避免数组长度不足导致的索引越界 if (o1.length <= 2 || o2.length <= 2) { // 自定义短数组的排序规则,比如按数组长度升序 return Integer.compare(o1.length, o2.length); } return o1[2] - o2[2]; }));
内容的提问来源于stack exchange,提问作者Abhijeetkumar
相关产品推荐
相关产品推荐

