Java List按多个属性分组实现方法

引言

在Java开发中,我们经常需要对List中的元素进行分组操作。通常情况下,我们可以使用Collectors.groupingBy方法来按照单个属性进行分组。但是,如果需要按照多个属性进行分组,该如何实现呢?本文将介绍一种实现Java List按多个属性分组的方法,并提供详细的步骤和示例代码。

流程图

flowchart TD
    A[获取List] --> B[创建Map]
    B --> C[遍历List]
    C --> D[根据属性值创建List]
    D --> E[将List添加到Map中]
    E --> F[返回Map]

类图

classDiagram
    class Person {
        -name: String
        -age: int
        +Person(name: String, age: int)
        +getName(): String
        +getAge(): int
    }

步骤

1. 获取List

首先,我们需要获取一个包含Person对象的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> personList = new ArrayList<>();
personList.add(new Person("Alice", 25));
personList.add(new Person("Bob", 30));
personList.add(new Person("Alice", 35));
personList.add(new Person("Bob", 40));

2. 创建Map

接下来,我们需要创建一个Map来存储分组结果。Map的键是分组属性的组合值,值是对应的分组结果。

Map<String, List<Person>> groupedMap = new HashMap<>();

3. 遍历List

然后,我们需要遍历List中的每个元素,并根据多个属性的组合值进行分组。

for (Person person : personList) {
    // TODO: 根据多个属性的组合值进行分组
}

4. 根据属性值创建List

在遍历List的过程中,我们需要根据多个属性的组合值创建一个List,并将当前元素添加到该List中。

List<Person> groupList = groupedMap.get(groupKey);
if (groupList == null) {
    groupList = new ArrayList<>();
    groupedMap.put(groupKey, groupList);
}
groupList.add(person);

5. 将List添加到Map中

最后,我们将每个分组的List添加到Map中。

groupedMap.put(groupKey, groupList);

6. 返回Map

完成分组操作后,我们可以将Map作为结果返回。

return groupedMap;

示例代码

下面是完整的示例代码:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("Alice", 25));
        personList.add(new Person("Bob", 30));
        personList.add(new Person("Alice", 35));
        personList.add(new Person("Bob", 40));
        
        Map<String, List<Person>> groupedMap = groupByMultipleProperties(personList);
        
        for (Map.Entry<String, List<Person>> entry : groupedMap.entrySet()) {
            String groupKey = entry.getKey();
            List<Person> groupList = entry.getValue();
            System.out.println("Group: " + groupKey);
            for (Person person : groupList) {
                System.out.println(person.getName() + ", " + person.getAge());
            }
            System.out.println();
        }
    }
    
    public static Map<String, List<Person>> groupByMultipleProperties(List<Person> personList) {
        Map<String, List<Person>> groupedMap = new HashMap<>();
        
        for (Person person : personList) {
            String groupKey = person.getName() + "_" + person.getAge();
            
            List<Person> groupList = groupedMap.get(groupKey);
            if (groupList == null) {
                groupList = new ArrayList<>();
                groupedMap.put(groupKey, groupList);
            }
            groupList.add(person);
        }
        
        return groupedMap;
    }
}

class Person {
    private String name;
    private int age;