2017-10-12 109 views
-3

我有一个具有名称和部门字段的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解决它。

+6

“我使用了比较器,试图对列表进行排序,但它不起作用。”什么没有用?什么代码和问题是什么?流是可接受的解决方案吗? – Nathan

+0

Show your comparator –

+2

'A,Arts'应该在'A,Science'之前? – Jerry06

回答

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()); 
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())