【发布时间】:2014-01-16 10:35:40
【问题描述】:
我有一个具有三个属性的学生类:
private String name;
private String age;
private String classStudy;
并实现 Collections Comparable
@Override
public int compareTo(Student o) {
if(name==null) return -100;
else if(age==null) return -50;
else if(classStudy==null) return -10;
else
return (name + age + classStudy).compareTo(o.getName() + o.getAge() + o.getClassStudy());
}
主方法:
public static void main(String []args){
List<Student> lists = new ArrayList<Student>();
lists.add(new Student("Tung", "24", "Java"));
lists.add(new Student("Hong", "26", "Uava"));
lists.add(new Student("yoiy", "42", "jrva"));
lists.add(new Student("Tung", "22", "Aava"));
lists.add(new Student("Tung", null, "Aava"));
lists.add(new Student("Tyn", "22", "Aava"));
lists.add(new Student("Tungh", "22", "Aava"));
lists.add(new Student("aung", "39", "ora"));
lists.add(new Student(null, null, "Aava"));
lists.add(new Student("Rung", "17", "Kva"));
lists.add(new Student(null, null, null));
Collections.sort(lists);
for(Student listTemp : lists){
System.out.println("Name : " + listTemp.getName() + ", Age : " + listTemp.getAge()
+ ", Class : "+ listTemp.getClassStudy());
}
}
结果: https://lh6.googleusercontent.com/-IIGbZ4uThRk/Ute08Qt6UJI/AAAAAAAAAsg/ahqgAKgMSHc/w325-h219-no/Capture6.PNG 但我希望 null 值按第一个位置排序(排序跟随名称 -> 年龄 -> 类)。我该怎么做?
【问题讨论】:
-
所以如果一个名字是空的,你希望它是第一个吗?
-
您的 compareTo 需要保持一致。 a.compareTo(b) == -b.compareTo(a) 但如果名称在两种情况下都为空,则始终返回 -100。您应该一次比较每个字段,而不是尝试组合它们。
-
顺便注意,在 compareTo 合约docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html987654322@中返回-1、-50或-100没有区别
标签: java generics null comparator comparable