Java中List.sort()自定义排序规则几种方式

 更新时间:2025年06月09日 09:31:39   作者:五道书童  
Java中可通过Comparator匿名类、Lambda表达式、静态方法、自定义对象及实现Comparable接口实现List排序,这篇文章主要介绍了Java中List.sort()自定义排序规则几种方式,需要的朋友可以参考下

在Java中,你可以通过以下几种方式为List.sort()方法自定义排序规则:

1. 使用Comparator匿名内部类

List<String> list = Arrays.asList("banana", "apple", "pear", "orange");
list.sort(new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.length() - s2.length(); // 按字符串长度排序
    }
});

2. 使用Lambda表达式(Java 8+)

List<String> list = Arrays.asList("banana", "apple", "pear", "orange");
list.sort((s1, s2) -> s1.length() - s2.length()); // 按字符串长度排序

3. 使用Comparator的静态方法(Java 8+)

List<String> list = Arrays.asList("banana", "apple", "pear", "orange");

// 按字符串长度排序
list.sort(Comparator.comparingInt(String::length));

// 先按长度,再按字母顺序
list.sort(Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()));

4. 自定义对象排序示例

class Person {
    String name;
    int age;
    
    // 构造方法、getter/setter省略
}

List<Person> people = Arrays.asList(
    new Person("Alice", 25),
    new Person("Bob", 20),
    new Person("Charlie", 30)
);

// 按年龄排序
people.sort(Comparator.comparingInt(Person::getAge));

// 按年龄降序
people.sort(Comparator.comparingInt(Person::getAge).reversed());

// 多条件排序:先按姓名,再按年龄
people.sort(Comparator.comparing(Person::getName).thenComparingInt(Person::getAge));

5. 实现Comparable接口

如果要对自定义类进行自然排序,可以让类实现Comparable接口:

class Person implements Comparable<Person> {
    String name;
    int age;
    
    @Override
    public int compareTo(Person other) {
        return this.age - other.age; // 按年龄排序
    }
}

List<Person> people = new ArrayList<>();
// 添加元素...
people.sort(null); // 使用自然排序

注意事项

  • compare方法返回负整数、零或正整数,分别表示第一个参数小于、等于或大于第二个参数
  • 对于可能产生溢出的数值比较,建议使用Integer.compare(a, b)而不是a - b
  • 排序是稳定的(相等元素保持原有顺序)
  • 对于大型集合,考虑使用并行排序(list.parallelStream().sorted(...)

以上方法可以根据具体需求选择使用,Java 8引入的Lambda和Comparator方法使代码更加简洁易读。

总结

到此这篇关于Java中List.sort()自定义排序规则几种方式的文章就介绍到这了,更多相关Java List.sort()自定义排序规则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java 中的函数式接口

    详解Java 中的函数式接口

    这篇文章主要为大家介绍了Java中的函数式接口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2021-12-12
  • 使用JPA进行CriteriaQuery进行查询的注意事项

    使用JPA进行CriteriaQuery进行查询的注意事项

    这篇文章主要介绍了使用JPA进行CriteriaQuery进行查询的注意事项,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 使用graalvm为带有反射功能的java代码生成native image的示例详解

    使用graalvm为带有反射功能的java代码生成native image的示例详解

    graalvm让native镜像支持反射的关键是利用json提前告诉它哪些类的哪些方法会被反射调用,然后它就能力在运行时支持反射了,这篇文章主要介绍了如何使用graalvm为带有反射功能的java代码生成native image,需要的朋友可以参考下
    2024-02-02
  • CyclicBarrier之多线程中的循环栅栏详解

    CyclicBarrier之多线程中的循环栅栏详解

    这篇文章主要介绍了CyclicBarrier之多线程中的循环栅栏的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • linux中java获取路径的实例代码

    linux中java获取路径的实例代码

    在本篇文章里小编给大家整理的是一篇关于linux中java获取路径的实例代码以及相关知识点,有兴趣的朋友们可以学习参考下。
    2020-02-02
  • 详解Spring中的拦截器与过滤器

    详解Spring中的拦截器与过滤器

    Filter 过滤器和Interceptor 拦截器是SpringBoot 的 Web 项目开发中长用到的,本文主要来和大家讨论一下 Filter 与 Interceptor 的做法及它们之间的区别,需要的可以参考下
    2023-07-07
  • SpringBoot HTTP 400排查方式

    SpringBoot HTTP 400排查方式

    这篇文章主要介绍了SpringBoot HTTP 400排查方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java缩小文件内存占用的方法技巧分享

    Java缩小文件内存占用的方法技巧分享

    在Java应用程序中,处理大文件时经常会遇到内存占用过高的问题,为了缩小文件的内存占用,我们可以采取一些有效的方法来优化和管理内存的使用,本文将介绍一些在Java中缩小文件内存占用的技巧,需要的朋友可以参考下
    2024-10-10
  • Java面试题冲刺第十九天--数据库(4)

    Java面试题冲刺第十九天--数据库(4)

    这篇文章主要为大家分享了最有价值的三道关于数据库的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java中的相除(/)和取余(%)的实现方法

    Java中的相除(/)和取余(%)的实现方法

    这篇文章主要介绍了Java中的相除(/)和取余(%)的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论