Skip to content

使用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
        }
    ]
}