Appearance
使用Stream分组排序
题目
给定一个List<User>
,其中User类具有以下属性:id(用户唯一标识)、name(用户名)、age(年龄)、city(所在城市)、salary(工资)。
要求按照以下规则对用户列表进行处理:
- 首先按照城市进行分组,每个城市中的用户形成一个子列表。
- 在每个城市分组内,按照年龄从大到小进行排序。
- 如果年龄相同,则按照工资从高到低进行排序
代码
java
package interview;
import com.alibaba.fastjson2.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
public class Question1Test {
@Test
public void test() {
/*
给定一个List<User>,其中User类具有以下属性:id(用户唯一标识)、name(用户名)、age(年龄)、city(所在城市)、salary(工资)。
要求按照以下规则对用户列表进行处理:
首先按照城市进行分组,每个城市中的用户形成一个子列表。
在每个城市分组内,按照年龄从大到小进行排序。
如果年龄相同,则按照工资从高到低进行排序
*/
List<User> userList = new ArrayList<>();
userList.add(new User(1, "Alice", 25, "New York", 5000.0));
userList.add(new User(2, "Bob", 30, "New York", 6000.0));
userList.add(new User(3, "Charlie", 35, "Los Angeles", 8500.0));
userList.add(new User(4, "David", 35, "Los Angeles", 7000.0));
userList.add(new User(5, "Eve", 30, "Chicago", 5500.0));
Map<String, List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getCity));
userMap.forEach((k, v) -> userMap.put(k, v.stream().sorted(Comparator.comparing(User::getAge).thenComparing(User::getSalary)).toList()));
log.info(JSON.toJSONString(userMap));
}
@Data
@NoArgsConstructor
@AllArgsConstructor
static
class User {
private int id;
private String name;
private int age;
private String city;
private double salary;
}
}
结果
json
{
"New York": [
{
"age": 25,
"city": "New York",
"id": 1,
"name": "Alice",
"salary": 5000
},
{
"age": 30,
"city": "New York",
"id": 2,
"name": "Bob",
"salary": 6000
}
],
"Chicago": [
{
"age": 30,
"city": "Chicago",
"id": 5,
"name": "Eve",
"salary": 5500
}
],
"Los Angeles": [
{
"age": 35,
"city": "Los Angeles",
"id": 4,
"name": "David",
"salary": 7000
},
{
"age": 35,
"city": "Los Angeles",
"id": 3,
"name": "Charlie",
"salary": 8500
}
]
}