使用Comparator构造PriorityQueue遇API级别错误,求非Comparable实现方案
解决Android中PriorityQueue比较器构造方法的API级别问题
我懂你的困扰——明明Comparator.compare()从API1就存在,但用PriorityQueue(Comparator)构造方法时却被要求API24。这其实是因为这个无初始容量的构造方法本身是在API24才加入Android的,和compare()方法的兼容性无关。
你不想让对象实现Comparable的需求完全合理,毕竟排序逻辑依赖外部变量,不该耦合到对象本身。这里有个完美的解决方案,用API1就支持的构造方法绕过版本限制:
核心方案:使用带初始容量的PriorityQueue构造方法
Android从API1开始就支持PriorityQueue(int initialCapacity, Comparator<? super E> comparator)这个构造方法,只需要指定一个初始容量(比如常用的10,后续队列会自动扩容),再传入你的自定义比较器即可。
代码示例(匿名内部类版,兼容低版本Android)
// 你的额外变量,用于控制排序逻辑 final int sortFactor = 3; Queue<Integer> priorityQueue = new PriorityQueue<>(10, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { // 这里用外部的sortFactor实现自定义排序,对象本身无需知晓 return Integer.compare(o1 * sortFactor, o2 * sortFactor); } });
代码示例(Lambda版,支持Java 8+的Android项目)
如果你的项目已经启用Java 8特性,代码可以更简洁:
int sortFactor = 3; Queue<Integer> priorityQueue = new PriorityQueue<>(10, (o1, o2) -> Integer.compare(o1 * sortFactor, o2 * sortFactor) );
为什么这个方案可行?
- 规避API24限制:带初始容量的构造方法从Android诞生起就存在,完全兼容低版本系统。
- 满足排序需求:排序逻辑完全由外部的
Comparator和额外变量控制,对象本身不需要实现Comparable,也不需要知道任何排序规则。 - 不影响队列功能:初始容量只是一个起始值,当队列元素超过容量时会自动扩容,不用操心容量不足的问题。
内容的提问来源于stack exchange,提问作者Madmenyo
相关产品推荐
相关产品推荐

