我有一个班级学生,名字和部门。
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解决它。
答案 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())