Java 分组后排序实现

介绍

在Java开发中,经常会遇到需要对一组数据进行分组后排序的需求。本文将介绍如何使用Java实现分组后排序的功能,并提供详细的代码示例和注释。

思路

实现Java分组后排序的一般思路如下:

  1. 首先,将待排序的数据按照分组的条件进行分组;
  2. 然后,对每个分组内的数据进行排序;
  3. 最后,将排序后的各个分组进行合并。

下面我们将详细讲解每一步所需要做的事情,并提供相应的代码示例。

代码示例

步骤1:分组

首先,我们需要将待排序的数据按照分组的条件进行分组。我们可以使用Java 8的Stream API来实现这一步骤,具体代码如下:

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class GroupingAndSortingExample {

    public static void main(String[] args) {
        List<Person> people = createPeople();

        // 使用Stream API将people按照age进行分组
        Map<Integer, List<Person>> groups = people.stream()
                .collect(Collectors.groupingBy(Person::getAge));
        
        // 打印分组结果
        groups.forEach((age, group) -> {
            System.out.println("Age: " + age);
            group.forEach(System.out::println);
            System.out.println();
        });
    }

    private static List<Person> createPeople() {
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 25));
        people.add(new Person("Bob", 30));
        people.add(new Person("Charlie", 25));
        people.add(new Person("Dave", 35));
        people.add(new Person("Eve", 30));
        return people;
    }

    static 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;
        }

        @Override
        public String toString() {
            return name + " (" + age + ")";
        }
    }
}

上述代码中,我们定义了一个Person类,包含姓名和年龄两个属性。首先,我们创建了一个people列表,包含了一些Person对象。然后,我们使用Stream API的Collectors.groupingBy方法对people列表进行分组,按照年龄进行分组。最后,我们使用groups.forEach方法遍历分组结果,并打印出来。

步骤2:排序

接下来,对每个分组内的数据进行排序。我们可以使用Java 8的Stream API来实现这一步骤,具体代码如下:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class GroupingAndSortingExample {

    public static void main(String[] args) {
        List<Person> people = createPeople();

        // 使用Stream API将people按照age进行分组
        Map<Integer, List<Person>> groups = people.stream()
                .collect(Collectors.groupingBy(Person::getAge));

        // 对每个分组内的数据按照name进行排序
        groups.forEach((age, group) -> {
            List<Person> sortedGroup = group.stream()
                    .sorted(Comparator.comparing(Person::getName))
                    .collect(Collectors.toList());
            groups.put(age, sortedGroup);
        });
        
        // 打印分组和排序结果
        groups.forEach((age, group) -> {
            System.out.println("Age: " + age);
            group.forEach(System.out::println);
            System.out.println();
        });
    }

    // ...
}

上述代码中,我们在步骤1的基础上,使用了Stream API的sorted方法对每个分组内的数据按照姓名进行排序。我们首先获取每个分组的数据,然后使用sorted方法进行排序,最后将排序后的结果存放回原来的分组中。

步骤3:合并

最后,将排序后的各个分组进行合并。我们可以使用Java 8的Stream API来实现这一步骤,具体代码如下:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class GroupingAndSortingExample {

    public static void main(String[] args