Java中如何按照值对ObservableList对象进行排序

4

我有一个名为Student的类,包含以下字段:

private int id;
private String firstName;
private String lastName;
private String imageLink;
private String email;
private String status;
private String fullName;
private int classId;  
private int percentage;
Button changeAttendanceButton;
ImageView attendanceImage;
ImageView photo;

字段"status"有两个可能的值: 1. present, 2. absent。

然后我有一个Observable List:

private ObservableList<Student> allStudentsWithStatus = FXCollections.observableArrayList();

我在这个列表中存储学生。每个学生都有出席或缺席的状态。

我需要按照状态对此ObservableList进行排序。我希望具有出席状态的学生首先出现在列表中。

有什么提示吗?

如果您能提供任何帮助,我将不胜感激。


4
请使用List.sort(Comparator)方法和合适的Comparator。合适的Comparator是基于status返回一个值的Comparator。另外,因为你使用了ObservableList,可以查看SortedList - Slaw
1
具体而言,您只需执行allStudentsWithStatus.sort(Comparator.comparing(Student::getStatus))来原地对列表进行排序,或者使用SortedList<Student> sortedStudents = new SortedList<>(allStudentsWithStatus, Comparator.comparing(Student::getStatus));。在任一情况下,将Comparator.comparing(Student::getStatus)替换为Comparator.comparing(Student::getStatus).reversed()以反转顺序。 - James_D
1
离题了,但我真的不确定为什么你会在只有两个可能值的情况下使用“String”。为什么不使用“boolean”呢? - James_D
谢谢@James_D,它起作用了!我想添加:“尚未提交”状态,也许稍后再说。 - Michal Moravik
1
那么,使用“枚举”比使用“字符串”更合适,对吗? - James_D
我正在处理数据库,所以我从那里获取字符串。我以前从未使用过枚举,所以我需要先学习它。但是谢谢你,我会考虑的。 - Michal Moravik
1个回答

5

1. 您可以创建自定义的 比较器(Comparator)

class StudentComparator implements Comparator<Student> {
  @Override
  public int compare(Student student1, Student student2) {
      return student1.getStatus()
               .compareTo(student2.getStatus());
  }
  //Override other methods...
}

或者像这样创建

Comparator<Student> studentComparator = Comparator.comparing(Student::getStatus);

然后使用一个:

ObservableList<Student> allStudentsWithStatus = ...

Collections.sort(allStudentsWithStatus, studentComparator);

或者像这样使用。
allStudentsWithStatus.sort(studentComparator);

2. 使用 SortedList (javafx.collections.transformation.SortedList<E>):

SortedList<Student> sortedStudents = new SortedList<>(allStudentsWithStatus, studentComparator);

3.如果您需要执行其他操作或将内容收集到其他集合(最慢的方式),请使用流API比较器

allStudentsWithStatus.stream()
        .sorted(Comparator.comparing(i -> i.getStatus()))
        //other actions
        //.filter(student -> student.getLastName().equals("Иванов"))
        .collect(Collectors.toList());
        //.collect(Collectors.toSet());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接