温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何自定义 java Comparator

发布时间:2026-09-13 03:03:38 来源:亿速云 阅读:98 作者:小樊 栏目:编程语言

在 Java 中,自定义 Comparator 通常用于对集合(如 ListTreeSetTreeMap 等)按自定义规则排序。下面从基础到进阶系统讲一下。


一、Comparator 是什么?

Comparator<T> 是一个函数式接口,只有一个核心方法:

int compare(T o1, T o2);

返回值含义:

  • 负数:o1 < o2
  • 0:o1 == o2
  • 正数:o1 > o2

二、最基础的自定义方式(匿名内部类)

List<Integer> list = Arrays.asList(5, 2, 9, 1);

Collections.sort(list, new Comparator<Integer>() {
    @Override
    public int compare(Integer a, Integer b) {
        return a - b; // 升序
    }
});

三、Java 8+:使用 Lambda(推荐)

list.sort((a, b) -> a - b);

或:

list.sort(Comparator.comparingInt(a -> a));

四、对自定义对象排序

1. 定义对象

class Student {
    String name;
    int age;

    Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

2. 按 age 排序

List<Student> students = Arrays.asList(
    new Student("Tom", 20),
    new Student("Jerry", 18)
);

students.sort((s1, s2) -> s1.age - s2.age);

五、使用 Comparator.comparing(最优雅)

单字段排序

students.sort(Comparator.comparing(s -> s.age));

或:

students.sort(Comparator.comparing(Student::getAge));

降序排序

students.sort(Comparator.comparing(Student::getAge).reversed());

六、多字段排序(非常重要)

先按 age 升序,再按 name 降序:

students.sort(
    Comparator
        .comparing(Student::getAge)
        .thenComparing(
            Comparator.comparing(Student::getName).reversed()
        )
);

七、null 值处理(避免 NPE)

students.sort(
    Comparator.nullsLast(Comparator.comparing(Student::getAge))
);
  • nullsFirst:null 排最前
  • nullsLast:null 排最后

八、在集合构造时使用 Comparator

TreeSet

Set<Student> set = new TreeSet<>(
    Comparator.comparing(Student::getAge)
);

TreeMap

Map<Student, String> map = new TreeMap<>(
    Comparator.comparing(Student::getName)
);

九、常见易错点

❌ 错误写法(可能溢出):

return a - b;

✅ 正确写法:

return Integer.compare(a, b);

十、总结

场景 推荐方式
简单排序 lambda
对象排序 Comparator.comparing
多条件 thenComparing
倒序 reversed()
空值安全 nullsFirst / nullsLast

如果你有具体对象或业务场景(比如日期、字符串、嵌套对象),可以直接贴代码,我可以帮你写最合适的 Comparator。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI