如何将list分组并按规定字段排序
时间: 2023-09-07 19:11:41 浏览: 85
首先,你需要确定分组的字段和排序的字段。接下来,你可以使用 Java 8 的 Stream API 来轻松实现分组和排序。
假设你有一个 `List<User>`,其中 `User` 类有 `name` 和 `age` 属性。你想要按照 `name` 字段分组,并按照 `age` 字段进行排序。代码示例如下:
```java
List<User> userList = new ArrayList<>();
// 添加用户数据
Map<String, List<User>> groupedUsers = userList.stream()
.collect(Collectors.groupingBy(User::getName));
List<List<User>> sortedGroups = new ArrayList<>(groupedUsers.values());
sortedGroups.forEach(group -> group.sort(Comparator.comparing(User::getAge)));
```
上述代码将会先按照 `name` 字段分组,并将结果保存在一个 `Map` 中。接着,我们将分组后的结果转换成一个 `List<List<User>>`,并对每个小组按照 `age` 字段进行排序。
最终,你将得到一个按照 `name` 字段分组并按照 `age` 字段排序的结果列表。
相关问题
如何将list按照多个属性分组分组并按规定字段排序
如果你想按照多个属性进行分组,可以使用 `Collectors.groupingBy` 方法的重载版本,该方法接受一个 `Function` 类型的参数,该参数可以返回一个自定义的键(key)来进行分组。你可以将多个属性组合成一个键,然后按照该键进行分组。
假设你有一个 `List<User>`,其中 `User` 类有 `name`、`age` 和 `gender` 属性。你想要按照 `name` 和 `gender` 字段进行分组,并按照 `age` 字段进行排序。代码示例如下:
```java
List<User> userList = new ArrayList<>();
// 添加用户数据
Map<String, Map<String, List<User>>> groupedUsers = userList.stream()
.collect(Collectors.groupingBy(User::getName, Collectors.groupingBy(User::getGender)));
List<List<User>> sortedGroups = new ArrayList<>();
groupedUsers.values().forEach(genderMap -> {
genderMap.values().forEach(group -> {
group.sort(Comparator.comparing(User::getAge));
sortedGroups.add(group);
});
});
```
上述代码将会先按照 `name` 和 `gender` 字段分组,并将结果保存在一个嵌套的 `Map` 中。接着,我们遍历每个分组,按照 `age` 字段进行排序,并将排序后的分组添加到一个列表中。
最终,你将得到一个按照 `name` 和 `gender` 字段组合分组并按照 `age` 字段排序的结果列表。
Stream流对list分组并按照某个字段排序
可以使用Java 8的Stream流API来对List进行分组和排序。下面是一个示例代码:
假设我们有一个Person类,其中包含姓名和年龄两个字段:
```
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
```
现在我们有一个List<Person>,我们想要按照年龄分组,并按照姓名进行排序:
```
List<Person> people = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 20),
new Person("David", 25),
new Person("Eva", 20)
);
Map<Integer, List<Person>> groupedByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge));
groupedByAge.forEach((age, list) -> {
System.out.println("Age " + age + ":");
list.stream()
.sorted(Comparator.comparing(Person::getName))
.forEach(person -> System.out.println(person.getName()));
});
```
输出结果为:
```
Age 20:
Charlie
Eva
Age 25:
Alice
David
Age 30:
Bob
```
首先我们使用 `Collectors.groupingBy` 方法以年龄为键来对人员进行分组,生成一个 `Map<Integer, List<Person>>`。接着我们遍历这个Map,对每个年龄段内的人员按照姓名进行排序,并输出结果。