首页 > 解决方案 > 如何按私有字段对列表进行排序?

问题描述

我的实体类如下所示:

public class Student {

   private int grade;

   // other fields and methods
 }

我像这样使用它:

List<Student> students = ...;

考虑到它是一个私有字段,students我该如何排序?grade

标签: javalistsortingoopencapsulation

解决方案


您有以下选择:

  1. 使grade可见
  2. 定义一个getter方法grade
  3. 定义一个Comparator 内部 Student
  4. 制作Student工具Comparable
  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);

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

  • 您可以轻松定义几个Comparators
  • 代码不多
  • 您的字段保持私有和封装

解决方案示例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代表学生的自然顺序
  • 一些预先存在的方法会自动排序(如TreeMap

推荐阅读