温馨提示×

温馨提示×

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

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

Comparator 如何自定义排序

发布时间:2026-07-18 11:46:30 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 Java 中,Comparator 用于自定义排序规则,常见用法有 匿名内部类、Lambda 表达式、方法引用、多条件排序 等。下面系统讲解。


一、最基本用法(自定义排序规则)

示例:按年龄升序排序

class Person {
    int age;
    String name;

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

使用 Comparator

List<Person> list = new ArrayList<>();
list.add(new Person("Alice", 20));
list.add(new Person("Bob", 18));

// 按 age 升序
list.sort((p1, p2) -> p1.age - p2.age);

✅ 返回值含义:

  • < 0:p1 排在 p2 前面
  • = 0:相等
  • > 0:p1 排在 p2 后面

二、常见写法汇总

1️⃣ Lambda 表达式(推荐)

list.sort((p1, p2) -> p1.age - p2.age);

2️⃣ 匿名内部类(旧写法)

list.sort(new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.age - o2.age;
    }
});

3️⃣ 使用 Comparator.comparing()(推荐 ✅)

list.sort(Comparator.comparing(p -> p.age));

或:

list.sort(Comparator.comparing(Person::getAge));

三、降序排序

方式一:reverse

list.sort(Comparator.comparing(Person::getAge).reversed());

方式二:手动反转

list.sort((p1, p2) -> p2.age - p1.age);

四、多条件排序(非常常见)

示例:先按年龄,再按姓名

list.sort(
    Comparator.comparing(Person::getAge)
              .thenComparing(Person::getName)
);

多条件 + 降序

list.sort(
    Comparator.comparing(Person::getAge)
              .thenComparing(Person::getName, Comparator.reverseOrder())
);

五、对集合排序的几种方式

方式一:Collections.sort

Collections.sort(list, Comparator.comparing(Person::getAge));

方式二:List.sort

list.sort(Comparator.comparing(Person::getAge));

六、对数组排序

Person[] arr = new Person[2];
arr[0] = new Person("Alice", 20);
arr[1] = new Person("Bob", 18);

Arrays.sort(arr, Comparator.comparing(Person::getAge));

七、处理 null 值(非常重要)

允许 null 排在最后

list.sort(Comparator.nullsLast(Comparator.comparing(Person::getAge)));

null 排在最前

list.sort(Comparator.nullsFirst(Comparator.comparing(Person::getAge)));

八、Comparator vs Comparable 区别

对比项 Comparator Comparable
所在类 外部定义 类内部实现
方法 compare(T o1, T o2) compareTo(T o)
是否侵入
适合场景 多种排序规则 默认排序

实际开发中:优先使用 Comparator


九、完整示例

list.sort(
    Comparator.comparing(Person::getAge)
              .thenComparing(Person::getName, Comparator.reverseOrder())
);

如果你愿意,可以告诉我:

  • ✅ 是 Java 对象排序 / Map 排序 / 字符串排序
  • ✅ 是否 升序 / 降序 / 多条件
  • ✅ 是否涉及 null、中文、数字字符串

我可以直接帮你写✔️最优代码。

向AI问一下细节

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

AI