对象list根据对象的某个字段或多个字段排序

本文介绍如何使用Java对列表中的对象按不同字段进行排序,包括单字段排序和多字段排序的方法。例如,可以按学生的成绩、年龄或年级进行排序,并且支持正序和倒序排列。

对象list根据对象的某个字段或多个字段排序的几种方法

1、根据成绩排序
 list.sort((x,y)->Float.compare(y.getScore(),x.getScore()));//倒序
 list.sort((x,y)->Float.compare(x.getScore(),y.getScore()));//正序
2、根据年龄排序
list.sort(Comparator.comparing(Student::getAge).reversed());//倒序
list.sort(Comparator.comparing(Student::getAge);//正序
3、根据年级排序
list.stream().sorted(Comparator.comparing(Student::getGrade).reversed()).collect(Collectors.toList());//倒序
list.stream().sorted(Comparator.comparing(Student::getGrade)).collect(Collectors.toList());//正序
4、先根据年级升序排序,再根据分数降序排序
list.stream().sorted(Comparator.comparing(Student::getGrade).thenComparing(Comparator.comparing(Student::getScore).reversed())).collect(Collectors.toList());
要对一个包含**对象的列表(list of objects)** 根据**两个字段**进行排序,可以使用 Python 内置的 `sorted()` 函数 `list.sort()` 方法,并结合 `key` 参数使用 `operator.attrgetter` `lambda` 表达式。 --- ### ✅ 示例:定义类和数据 ```python class Person: def __init__(self, name, age, city): self.name = name self.age = age self.city = city def __repr__(self): return f"Person({self.name}, {self.age}, {self.city})" # 数据 people = [ Person("Alice", 25, "Beijing"), Person("Bob", 30, "Shanghai"), Person("Charlie", 25, "Beijing"), Person("David", 30, "Guangzhou"), Person("Eve", 25, "Shanghai") ] ``` --- ### ✅ 需求:先按 `age` 升序,再按 `city` 字典序升序 #### 方法 1:使用 `attrgetter`(推荐,性能好) ```python from operator import attrgetter # 原地排序 people.sort(key=attrgetter('age', 'city')) print(people) ``` #### 方法 2:使用 `lambda` ```python people.sort(key=lambda p: (p.age, p.city)) ``` > 输出示例: ```python [ Person(Alice, 25, Beijing), Person(Charlie, 25, Beijing), Person(Eve, 25, Shanghai), Person(David, 30, Guangzhou), Person(Bob, 30, Shanghai) ] ``` --- ### ✅ 多级排序规则说明 - Python 元组比较是**从左到右逐个比较**的。 - `(p.age, p.city)` 会先比较 `age`,相等时再比较 `city`。 - 默认为**升序**;若要降序,见下文。 --- ### ✅ 自定义排序方向(如:age 升序,city 降序) ```python # 使用负数仅适用于数字;字符串需用 reversed 处理 people.sort(key=lambda p: (p.age, -len(p.city))) # 不够直观 # 更清晰的做法:分步排序(利用稳定排序特性) people.sort(key=attrgetter('city'), reverse=True) # 第二优先级:city 降序 people.sort(key=attrgetter('age')) # 第一优先级:age 升序(后排序,保持稳定性) ``` > ⚠️ **技巧**:Python 排序是稳定的,所以应**从低优先级到高优先级逆序调用 sort**。 --- ### ✅ 使用 `sorted()` 返回新列表(不修改原列表) ```python sorted_people = sorted(people, key=attrgetter('age', 'city')) # sorted_people = sorted(people, key=lambda p: (p.age, p.city)) ``` --- ### ✅ 如果字段可能为 None,安全处理 ```python # 将 None 视为最小值最大值 people.sort(key=lambda p: (p.age if p.age is not None else float('inf'), p.city or "")) ``` --- ### 解释总结: | 方法 | 优点 | 适用场景 | |------|------|---------| | `attrgetter('field1', 'field2')` | 快、可读性强、支持多层属性(如 `'profile.address.city'`) | 推荐用于简单字段排序 | | `lambda p: (p.field1, p.field2)` | 灵活,可做转换、条件判断 | 需要计算处理逻辑时 | | 分步 `sort` | 可控制不同字段升降序 | 混合排序方向 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值