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

如何在类构造方法中传入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);
    }
}

关键改动解释

  1. 移除Comparator实现:SortedList<T>的职责是维护有序列表,比较逻辑交给外部传入的Comparator即可,不需要自身实现该接口。
  2. 保存Comparator成员变量:把构造方法接收的c赋值给类成员,这样后续添加元素时能随时调用它的compare方法。
  3. 使用List替代Integer数组:ArrayList<T>天生支持泛型,自动扩容、插入元素等操作都比数组便捷,还避免了泛型数组的类型安全问题。
  4. 正确使用Comparator的compare方法:comparator.compare(a, b)的返回值规则:
    • 负数:a应该排在b前面
    • 0:a和b排序优先级相同
    • 正数:a应该排在b后面
  5. 泛型化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:03:11