如何在Java中按字母顺序对每个组中的列表进行排序

时间:2017-10-12 09:09:11

标签: java android sorting java-8

我有一个班级学生,名字和部门。

class Student{
    String name;
    String department;
    public Student(String name, String department){
        this.name = name;
        this.department = department;
    }
}

此外,我将这些样本数据放在list-

    List<Student>students = new ArrayList<>();
    students.add(new Student("A", "Science"));
    students.add(new Student("B", "Arts"));
    students.add(new Student("L", "Science"));
    students.add(new Student("C", "Science"));
    students.add(new Student("D", "Science"));
    students.add(new Student("A", "Arts"));
    students.add(new Student("X", "Arts"));
    students.add(new Student("C", "Arts"));

我希望它们在每个组中按字母顺序排序,以便输出看起来像这样 -

A, Science
C, Science
D, Science
L, Science
A, Arts
B, Arts
C, Arts
X, Arts

我使用了比较器并尝试对列表进行排序,但它不起作用。好像其他人用java 8流解决了它。任何人都可以使用Stream api解决它。

2 个答案:

答案 0 :(得分:2)

使用流也需要一个比较器。根据您需要的确切顺序(首先是部门或首先命名)。应该也可以使它安全无效。

List<Student> sortedStudents = students.stream().sorted((o1, o2) -> {
    int depDiff = o1.department.compareTo(o2.department);
    if (depDiff == 0) {
        return o1.name.compareTo(o2.name);
    }
    return depDiff;
}).collect(Collectors.toList());

答案 1 :(得分:0)

如果我理解正确,您首先需要按department进行分组,并按降序排序;而每组中的值应按升序排序。

分组后,您需要按照指定的顺序重新创建列表。

students.stream()
            .collect(Collectors.groupingBy(
                    Student::getDepartment,
                    () -> new TreeMap<>(Comparator.<String> reverseOrder()),
                    Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getName)))))
            .entrySet()
            .stream()
            .flatMap(e -> e.getValue().stream().map(x -> new Student(x.getName(), e.getKey())))
            .collect(Collectors.toList())