java - 使用类似的界面对列表进行排序

标签 java sorting collections comparable

我需要根据学生名次对类(class)列表进行排序

I/P - List<Class> classes = new ArrayList<Class>();

o/p - 根据卷号排序列表

public class Class implements Comparable<Class>{

    List<Student> students;

    ...

    @Override
    public int compareTo(Class o) {

    ...
    }

}

我想实现类的compareTo方法,以便它可以根据学生的卷数来比较学生。

public class Student implements Comparable<Student> {

    String firstname;
    Integer rollnumber;

    public int compareTo(Student o1) {
        if (this.rollnumber == ((Student) o1).rollnumber)
            return 0;
        else if ((this.rollnumber) > ((Student) o1).rollnumber)
            return 1;
        else
            return -1;
    }
    // ...
}

最佳答案

  1. List一个项目可以出现多次次。因此,与 0 进行比较的同一对象是未知顺序。使用Set相反,只有 Set防止重复值。
  2. 如果您不喜欢空值,则应使用 TreeSet .
  3. 卷号的比较应采用自然顺序,但 rollnumber -顺序并不直观,如果我问你谁是第一个学生,我希望得到像 Max Mustermann 这样的答案而不是23948234 。当然,这是一个直观的论证并且基于意见,但它就像自然排序的决定 String ,这是常见的做法。
  4. TreeSet可以使用 comparator 构建作为构造函数参数实现,这将更适合您的需求。
  5. 如果您喜欢 DRY,请使用 Integer.compare .

所以我建议:

private static final Comparator<Student> ROLL_ORDER = new Comparator<Student>(){
    public int compare(Student o1, Student o2) {
        return Integer.compare(o1.rollnumber, o2.rollnumber);
    }
}
private final Set<Student> students = new TreeSet<Student>(ROLL_ORDER);

关于java - 使用类似的界面对列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26097379/

相关文章:

java - 在 Jackcess 中对表格进行排序

MySQL 查询 - 排序和分组的混合

python - 文件中最常见的 "startswith"以推断注释字符

c# - 我可以从匿名类中定义数组或列表吗?

java - 是什么导致我的空指针异常

java - 在 MySQL 语句中传递变量

java - Recyclerview android 不工作

r - 如何通过交替值对向量进行排序

c++ - std::sort() 中使用了哪种类型的排序?

Laravel:如何对忽略语言文章的 Eloquent 集合进行排序?