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

时间:2014-09-29 10:09:02

标签: java sorting collections comparable

我需要根据它的学生卷号

对Class列表进行排序

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;
    }
    // ...
}

1 个答案:

答案 0 :(得分:0)

  1. List中,项目可以多次次。因此,与0比较的相同Object是未知顺序。请改用Set,仅Set阻止重复值。
  2. 如果您不想使用空值,则应使用TreeSet
  3. rollnumber的比较应该是一个自然的顺序,但是rollnumber - 顺序不直观,如果我问你是谁,我希望得到的答案是Max Mustermann而不是23948234 {1}}。当然这是一个直观的论证和基于意见的论点,但它就像String这种常见做法的自然决定一样。
  4. TreeSet可以使用comparator实现构造为构造函数参数,这样可以更好地满足您的需求。
  5. 如果您喜欢DRY,请使用Integer.compare
  6. 所以我建议:

    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);