2017-10-12 40 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())