如何按私有字段对列表进行排序?

2022-09-02 05:00:05

我的实体类如下所示:

public class Student {

   private int grade;

   // other fields and methods
 }

我这样使用它:

List<Student> students = ...;

考虑到它是一个私有字段,我如何排序依据 ,studentsgrade


答案 1

您有以下选择:

  1. 使可见grade
  2. 定义一个 getter 方法grade
  3. 定义一个内部Comparator Student
  4. 使实现StudentComparable
  5. 使用反射(在我看来,这不是一个解决方案,它是一个解决方法/黑客)

解决方案示例:3

public class Student {
    private int grade;

    public static Comparator<Student> byGrade = Comparator.comparing(s -> s.grade);
}

并像这样使用它:

List<Student> students = Arrays.asList(student2, student3, student1);
students.sort(Student.byGrade);
System.out.println(students);

这是我最喜欢的解决方案,因为:

  • 您可以轻松定义多个 sComparator
  • 它不是太多的代码
  • 您的领域保持私密和封装

解决方案示例:4

public class Student implements Comparable {
    private int grade;

    @Override
    public int compareTo(Object other) {
        if (other instanceof Student) {
            return Integer.compare(this.grade, ((Student) other).grade);
        }
        return -1;
    }
}

您可以像这样在任何地方进行排序:

List<Student> students = Arrays.asList(student2, student3, student1);
Collections.sort(students);
System.out.println(students);

此解决方案的各个方面:

  • 这定义了,排序依据代表了学生的自然顺序grade
  • 一些预先存在的方法将自动排序(如树状图))

答案 2

通常,如果您需要一种取决于学生成绩的行为,那么此信息必须是可访问的 - 添加允许其他代码访问它的方法或属性。

因此,最简单的修复方法是:

public class Student implements IStudent {

    ...
    private int grade;
    ...
    // other fields and methods

    public int getGrade() {
        return grade;
    }
}

您可能还应该扩展界面:)IStudent

但是,如果您只需要将其用于排序,则可以使用其他答案中已经提出的想法:实现Compable接口。通过这种方式,您可以保留隐藏,并在方法中使用它。gradeint compareTo