【问题标题】:Sort list of list using comparable interface使用可比较的界面对列表进行排序
【发布时间】:2014-11-23 16:44:01
【问题描述】:

我需要根据学生人数对班级列表进行排序

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

o/p - 基于rollnumber的排序列表

public class Class implements Comparable<Class>{

    List<Student> students;

    ...

    @Override
    public int compareTo(Class o) {

    ...
    }

}

我想实现 Class 的 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;
    }
    // ...
}

【问题讨论】:

  • 如何实现 class 'Class' 的 compareTo 方法?
  • 您不必再次实现compareTo()。您的Student 类已经定义了一个,当您调用Collections.sort() 时将使用它。并请重命名classClass 已经是 java 的内置类了。
  • 听起来你对比较 Class 对象不感兴趣。那么实现Comparable有什么用呢?您最好添加一个公共方法来调用Collections.sort(students)
  • 但我的 i/p 是 List classes = new ArrayList();所以有可能做这样的事情 Collection.sort(classes) 排序是基于学生的rollnumber。
  • I need to sort list of Class based on it's students rollnumber我认为你应该重新构建它?

标签: java sorting collections comparable


【解决方案1】:
  1. List 中,一个项目可以有多次 次。因此,与 0 比较的同一对象是未知顺序。请改用Set,只有Set 才能防止重复值。
  2. 如果您不喜欢有空值,您应该使用TreeSet
  3. rollnumber 的比较应该是自然顺序,但rollnumber-order 并不直观,如果我要问你谁是第一个学生,我希望得到像 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);

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 2018-09-10
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多