java stream 分组并排序
时间: 2025-06-20 16:15:14 浏览: 2
<think>我们有两个需求:分组和排序。分组使用Collectors.groupingBy,排序可以在分组前或分组后进行。用户要求的是分组后排序,这里有两种排序可能:1.对分组后的Map的键(即分组字段的值)进行排序2.对每个分组内的元素进行排序根据引用[1]我们知道如何对流中的元素进行排序(使用sorted和Comparator)。引用[2]展示了分组后对分组内的元素进行映射处理(使用mapping),但未直接展示排序。因此,我们可以分两种情况给出示例:情况1:分组前先对整体流排序(这样分组后每个组内的元素就是有序的)情况2:分组后对每个组内的列表进行排序(使用下游收集器进行排序)情况3:分组后对Map的键进行排序(即按组名排序)另外,分组后整个Map的键是无序的(默认是HashMap),如果希望按键排序,可以使用TreeMap或收集后对Map的键进行排序。下面分别给出示例:示例数据:Student类(姓名,班级,成绩)</think>### Java Stream 分组后排序示例
在 Java Stream 中实现分组后排序有两种常见场景:**分组内元素排序**和**分组键排序**。以下是具体实现方法:
#### 1. 分组内元素排序(每组学生按成绩降序)
```java
import java.util.*;
import java.util.stream.*;
Map<String, List<Student>> sortedGroups = students.stream()
.collect(Collectors.groupingBy(
Student::getClassName, // 分组字段
Collectors.collectingAndThen(
Collectors.toList(),
list -> list.stream()
.sorted(Comparator.comparingInt(Student::getScore).reversed()) // 组内排序
.collect(Collectors.toList())
)
));
/* 输出示例:
A班: [王五(95), 张三(85)]
B班: [李四(90)]
*/
```
- 使用 `collectingAndThen` 对分组后的列表二次处理[^2]
- `Comparator.comparingInt().reversed()` 实现降序排序[^1]
#### 2. 分组键排序(按班级名称排序)
```java
TreeMap<String, List<Student>> sortedByKey = students.stream()
.collect(Collectors.groupingBy(
Student::getClassName,
TreeMap::new, // 使用TreeMap自动按键排序
Collectors.toList()
));
// 自定义排序规则:按班级名称长度排序
TreeMap<String, List<Student>> customSorted = students.stream()
.collect(Collectors.groupingBy(
Student::getClassName,
() -> new TreeMap<>(Comparator.comparingInt(String::length)), // 自定义比较器
Collectors.toList()
));
```
#### 3. 分组后键值双重排序(班级排序 + 组内成绩排序)
```java
LinkedHashMap<String, List<Student>> fullySorted = students.stream()
.sorted(Comparator.comparing(Student::getClassName) // 先按班级排序
.thenComparingInt(Student::getScore).reversed()) // 再按成绩降序
.collect(Collectors.groupingBy(
Student::getClassName,
LinkedHashMap::new, // 保持插入顺序
Collectors.toList()
));
```
#### 关键点说明:
1. **组内排序**:通过下游收集器的 `collectingAndThen` 实现
2. **分组键排序**:
- 使用 `TreeMap` 自动按键的自然顺序排序
- 通过 `Comparator` 自定义排序逻辑
3. **保持顺序**:`LinkedHashMap` 保留元素收集时的顺序
> 引用说明:`Collectors.groupingBy()` 支持三参数形式控制返回的 Map 类型[^2],结合 `Comparator` 可实现灵活排序[^1]。
阅读全文
相关推荐

















