Java中List按自定义顺序排序的几种实现过程

 更新时间:2025年07月15日 16:15:08   作者:九转成圣  
文章介绍Java中按省份自定义排序的三种方法:Map(高效易维护)、Enum(类型安全可扩展)、List.indexOf(简洁但效率低),推荐根据数据量和需求选择,大数据量优先Map或Enum,小数据量可用List.indexOf,强调代码可读性和维护性

在实际开发中,我们经常需要对集合中的对象按照特定字段进行排序。当排序规则不是简单的字母或数字顺序,而是自定义的顺序时,我们需要采用特殊的方法。

本文将以一个List<Person>按省份特定顺序(北京、上海、广州、深圳)排序为例,介绍几种实现方案并分析它们的优缺点。

问题描述

我们有一个Person类:

@Data
public class Person {
    private String name;
    private int age;
    private String province;
}

需要将List<Person>按照省份的特定顺序排序:北京 > 上海 > 广州 > 深圳,其他省份排在最后。

解决方案

方案1:使用Map定义顺序权重

Map<String, Integer> provinceOrder = Map.of(
    "北京", 1,
    "上海", 2,
    "广州", 3,
    "深圳", 4
);

persons.sort(Comparator.comparingInt(
    p -> provinceOrder.getOrDefault(p.getProvince(), Integer.MAX_VALUE)
));

优点

  • 实现简单直观
  • 易于修改顺序(只需调整Map)
  • 性能良好(O(1)的查找复杂度)

缺点

  • 需要额外维护一个Map
  • 顺序修改时需要重建Map

方案2:使用Enum定义顺序

enum ProvincePriority {
    BEIJING("北京", 1),
    SHANGHAI("上海", 2),
    GUANGZHOU("广州", 3),
    SHENZHEN("深圳", 4),
    OTHER("其他", Integer.MAX_VALUE);
    
    private final String name;
    private final int priority;
    
    // 构造函数、getter等
    
    public static int getPriority(String provinceName) {
        return Arrays.stream(values())
                   .filter(pp -> pp.name.equals(provinceName))
                   .findFirst()
                   .orElse(OTHER)
                   .getPriority();
    }
}

persons.sort(Comparator.comparingInt(
    p -> ProvincePriority.getPriority(p.getProvince())
));

优点

  • 类型安全
  • 可扩展性强
  • 易于维护(相关逻辑封装在Enum中)

缺点

  • 实现稍复杂
  • 需要定义额外的Enum类

方案3:使用List.indexOf方法

List<String> order = List.of("北京", "上海", "广州", "深圳");

persons.sort(Comparator.comparingInt(p -> {
    int index = order.indexOf(p.getProvince());
    return index == -1 ? Integer.MAX_VALUE : index;
}));

优点

  • 代码简洁
  • 顺序直观可见(直接写在List中)

缺点

  • 每次比较都需要查找索引(O(n)复杂度)
  • 性能不如前两种方案

性能比较

对于大数据量排序的性能表现:

  1. Map方案:最佳,因为Map的查找是O(1)复杂度
  2. Enum方案:与Map方案相当,但可能稍慢(取决于Enum实现)
  3. List.indexOf方案:最差,因为每次比较都需要遍历List

最佳实践建议

  1. 小数据量:三种方案都可以,选择最易读的(通常是方案3)
  2. 大数据量:优先选择方案1或方案2
  3. 需要强类型检查:选择方案2
  4. 顺序可能频繁变更:选择方案1

扩展思考

多级排序:可以在Comparator中添加thenComparing实现多级排序

persons.sort(Comparator
    .comparingInt(p -> provinceOrder.getOrDefault(p.getProvince(), Integer.MAX_VALUE))
    .thenComparing(Person::getAge)
);

动态顺序:可以从数据库或配置文件中加载排序规则,实现动态排序

空值处理:需要考虑province为null的情况,可以在Comparator中添加null处理

总结

在Java中实现自定义顺序排序有多种方式,选择哪种方案取决于具体场景:

  • 简单场景:使用List.indexOf方案(方案3)
  • 一般场景:推荐使用Map方案(方案1)
  • 复杂/企业级应用:考虑使用Enum方案(方案2)

无论选择哪种方案,保持代码的可读性和可维护性都是最重要的考量因素。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java使用HashMap实现并查集

    Java使用HashMap实现并查集

    这篇文章主要为大家详细介绍了Java使用HashMap实现并查集,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • SpringBoot配置文件、多环境配置、读取配置的4种实现方式

    SpringBoot配置文件、多环境配置、读取配置的4种实现方式

    SpringBoot支持多种配置文件位置和格式,其中application.properties和application.yml是默认加载的文件,配置文件可以根据环境通过spring.profiles.active属性进行区分,命令行参数具有最高优先级,可覆盖其他所有配置
    2024-09-09
  • Java windows环境构建图文教程

    Java windows环境构建图文教程

    这篇文章主要为大家介绍了Java windows环境构建图文教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2023-12-12
  • MybatisPlus批量保存原理及失效原因排查全过程

    MybatisPlus批量保存原理及失效原因排查全过程

    这篇文章主要介绍了MybatisPlus批量保存原理及失效原因排查全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 剑指Offer之Java算法习题精讲数组与二叉树

    剑指Offer之Java算法习题精讲数组与二叉树

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • Java在重载中使用Object的问题

    Java在重载中使用Object的问题

    这篇文章主要介绍了Java在重载中使用Object的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • JavaAgent实现http接口发布方式浅析

    JavaAgent实现http接口发布方式浅析

    这篇文章主要介绍了JavaAgent实现http接口发布方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • java中BCryptPasswordEncoder密码的加密与验证方式

    java中BCryptPasswordEncoder密码的加密与验证方式

    这篇文章主要介绍了java中BCryptPasswordEncoder密码的加密与验证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • SpringBoot整合MyBatis实现CRUD操作项目实践

    SpringBoot整合MyBatis实现CRUD操作项目实践

    本文主要介绍了SpringBoot整合MyBatis实现CRUD操作项目实践,如何实现数据库的CRUD创建、读取、更新、删除操作,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • SpringBoot中MVC的自动配置详解

    SpringBoot中MVC的自动配置详解

    这篇文章主要介绍了SpringBoot中MVC的自动配置详解,在实际开发过程中,还有一些老的系统在使用xml格式来传输数据,SpringBoot也提供了xml格式数据的返回,只需要小小的改动,就可以实现,需要的朋友可以参考下
    2023-09-09

最新评论