如何在类构造方法中传入Comparator并实现通用对象排序?
解决你的SortedList泛型与Comparator使用问题
首先,咱们先梳理下你代码里的几个核心问题,然后一步步修正:
核心问题分析
- 不必要的Comparator实现:你的
SortedList<T>不需要实现Comparator<T>,因为你是通过构造方法传入一个外部比较器来使用,而不是让自身成为比较器。 - 泛型不兼容的成员变量:你用了
Integer[] array,但目标是支持任意类型T,这完全限制了泛型的作用,应该换成泛型容器或者更灵活的List<T>。 - 未保存传入的Comparator:构造方法里接收了
Comparator<T> c,但没有把它存为类的成员变量,导致后续无法调用它的比较逻辑。 - 错误的比较方式:你写的
num.compareTo(array[i] > 0)不仅语法错误(array[i] >0是布尔值,不能作为compareTo的参数),而且依赖于T实现Comparable,这和你想用外部Comparator的初衷矛盾。 - sort方法的参数限制:当前
sort方法只接受Integer,无法处理泛型类型T。
修正后的代码示例
import java.util.Comparator; import java.util.ArrayList; import java.util.List; public class SortedList<T> { // 改用List<T>处理泛型,比数组更灵活且避免类型转换问题 private List<T> elements; // 保存传入的比较器作为成员变量,后续排序时调用 private Comparator<T> comparator; // 构造方法接收并初始化比较器与元素列表 public SortedList(Comparator<T> c) { this.elements = new ArrayList<>(); this.comparator = c; } // 添加元素时按照Comparator的规则插入到正确位置 public void add(T element) { int insertIndex = 0; // 遍历找到第一个比当前元素"大"的位置,插入到它前面 while (insertIndex < elements.size()) { // 使用传入的comparator的compare方法做比较 if (comparator.compare(element, elements.get(insertIndex)) < 0) { break; } insertIndex++; } elements.add(insertIndex, element); } // 可选:获取排序后的完整列表 public List<T> getElements() { return new ArrayList<>(elements); } }
关键改动解释
- 移除Comparator实现:
SortedList<T>的职责是维护有序列表,比较逻辑交给外部传入的Comparator即可,不需要自身实现该接口。 - 保存Comparator成员变量:把构造方法接收的
c赋值给类成员,这样后续添加元素时能随时调用它的compare方法。 - 使用List
替代Integer数组 :ArrayList<T>天生支持泛型,自动扩容、插入元素等操作都比数组便捷,还避免了泛型数组的类型安全问题。 - 正确使用Comparator的compare方法:
comparator.compare(a, b)的返回值规则:- 负数:
a应该排在b前面 - 0:
a和b排序优先级相同 - 正数:
a应该排在b后面
- 负数:
- 泛型化add方法:参数改为
T element,支持任意类型的元素,只要传入对应的Comparator就能完成排序。
使用示例
比如创建一个按字符串长度排序的SortedList<String>:
public class Main { public static void main(String[] args) { // 定义按字符串长度升序的比较器 Comparator<String> stringLengthComparator = (s1, s2) -> s1.length() - s2.length(); SortedList<String> sortedStrings = new SortedList<>(stringLengthComparator); sortedStrings.add("apple"); sortedStrings.add("banana"); sortedStrings.add("cherry"); sortedStrings.add("date"); // 输出结果:[date, apple, banana, cherry] System.out.println(sortedStrings.getElements()); } }
关于你原来的报错
你遇到的Cannot find symbol - method compareTo错误,一是因为array[i] >0是布尔值,不能作为compareTo的参数;二是当你切换到泛型T后,T不一定实现了Comparable接口,所以不能直接调用compareTo,必须用传入的Comparator来完成比较逻辑。
内容的提问来源于stack exchange,提问作者kocho84
相关产品推荐
相关产品推荐

