行业资讯 2025年08月6日
0 收藏 0 点赞 823 浏览 2458 个字
摘要 :

文章目录 1.自然顺序和逆序排序 1.1. 对字符串ArrayList进行排序 1.2. 按字段对对象的ArrayList进行排序 2.使用比较器进行自定义排序 2.1. 创建自定义比较器 2.2. 使……




  • 1.自然顺序和逆序排序
    • 1.1. 对字符串ArrayList进行排序
    • 1.2. 按字段对对象的ArrayList进行排序
  • 2.使用比较器进行自定义排序
    • 2.1. 创建自定义比较器
    • 2.2. 使用比较器进行排序
  • 3.结论

学习如何使用Collections.sort()方法对对象列表进行排序,下面是一些示例。

默认情况下,sort()方法按升序(或自然顺序)对给定的列表进行排序。我们可以使用Collections.reverseOrder()方法,该方法返回一个比较器,用于进行逆序排序。

1.自然顺序和逆序排序

Collections.sort(list);  //自然排序

Collections.sort(list, Collections.reverseOrder());   //逆排序

上述方法将指定的项目列表按其自然顺序排序。

  • 所有项目必须实现Comparable接口。
  • 所有项目必须可相互比较,不应抛出ClassCastException异常。
  • 此排序保证是稳定的,这意味着等于的元素不会因排序而重新排序。
  • 指定的列表必须是可修改的,但不必是可调整大小的。
  • sort()方法不返回任何值。

1.1. 对字符串ArrayList进行排序

Java程序按词典顺序对字符串列表进行排序。

List<String> names = 
    Arrays.asList(\"Alex\", \"Charles\", \"Brian\", \"David\");

//输出 - [Alex, Brian, Charles, David]
Collections.sort(names);    

//输出 - [David, Charles, Brian, Alex]
Collections.sort(names, Collections.reverseOrder());

1.2. 按字段对对象的ArrayList进行排序

我们可能需要对具有自己的排序逻辑的自定义对象列表进行排序。在这种情况下,在自定义类中实现Comparator接口。

例如,域对象Employee在名称字段上具有默认排序。在compareTo()方法中查看比较逻辑。

public class Employee implements Comparable<Employee>{
    private Integer id;
    private String name;
    private String email;
    private LocalDate dateOfBirth;
    //Getters and Setters
    @Override
    public int compareTo(Employee e) {
        return this.getName().compareTo(e.getName());
    }
}

以下Java程序按名称对Employee对象列表进行排序。

ArrayList<Employee> employees = methodReturnsUnsortedList();
//自然排序
Collections.sort(employees);
//逆排序
Collections.sort(employees, Collections.reverseOrder());

2.使用比较器进行自定义排序

sort()方法中的第二个参数接受一个Comparator的实例。

我们可以使用比较器的帮助来实现任何类型的比较逻辑,然后我们可以使用sort()方法基于给定的自定义逻辑对列表进行排序。

Collections.sort(List, Comparator);

我们可以为每种排序需求创建单独的Comparator实例,然后将这些实例组合在一起以创建分组排序效果。

例如,如果我们想要对Employee列表按照三个字段排序 – id、name和age。在这种情况下,我们需要创建3个Comparator实例。

2.1. 创建自定义比较器

这是在Java中创建比较器的一般语法。在这种情况下,我们正在创建一个按id字段对Employee列表进行排序的比较器。

Comparator<Employee> compareById = new Comparator<Employee>() {
    @Override
    public int compare(Employee o1, Employee o2) {
        return o1.getId().compareTo(o2.getId());
    }
};
Comparator<Employee> compareByName = new Comparator<Employee>() {
    @Override
    public int compare(Employee o1, Employee o2) {
        return o1.getName().compareTo(o2.getName());
    }
};

我们可以使用lambda表达式来进一步缩短语法。

//Id 比较器
Comparator<Employee> compareById = (Employee o1, Employee o2) ->
                    o1.getId().compareTo( o2.getId() );
//Name 比较器
Comparator<Employee> compareByName = (Employee o1, Employee o2) ->
                    o1.getName().compareTo( o2.getName() );

2.2. 使用比较器进行排序

ArrayList<Employee> employees = getUnsortedEmployeeList();
Comparator<Employee> compareById =
    (Employee o1, Employee o2) -> o1.getId().compareTo( o2.getId() );
Collections.sort(employees, compareById);
Collections.sort(employees, compareById.reversed());

3.结论

在上面的代码示例中,我们学习了如何按默认顺序或逆序对ArrayList进行排序。我们还学习了如何使用比较器来实现自定义排序逻辑。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9338.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号