如何在Java中的每个组中按字母顺序排序列表
问题描述:
我有一个具有名称和部门字段的Student类。如何在Java中的每个组中按字母顺序排序列表
class Student{
String name;
String department;
public Student(String name, String department){
this.name = name;
this.department = department;
}
}
而且我有一个列表 -
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解决它。
答
使用流将有效地需要一个比较器。取决于您需要的确切顺序(部门第一或名字第一)。应该也可以使其无效。
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());
答
如果我理解正确,您首先需要按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())
“我使用了比较器,试图对列表进行排序,但它不起作用。”什么没有用?什么代码和问题是什么?流是可接受的解决方案吗? – Nathan
Show your comparator –
'A,Arts'应该在'A,Science'之前? – Jerry06