經過會遇到這樣的情況,對於某個對象數組或者鏈表要按照一定的規則進行排序,那麼我們該怎麼做呢?
如遇到這樣的需求:
1.需求1
對於學生對象按照年齡進行排序,年齡小的排在前面。
單單看到這樣的需求,實現起來是比較簡單的,自己寫個函數實現一下快速排序或者比較土的冒泡排序,按照年齡來排序就可以了。我們再看看下面的需求
2.需求2
對於學生對象,按照年齡進行排序,年齡小的排在前面,年齡相同的,身高小的排在前面。
3.需求3
對於學生對象,按照年齡進行排序,年齡小的排在前面;年齡相同的,身高小的排在前面;身高相同時,體重輕的排在前面。
。。。
這樣的需求,可能會隨着頁面的複雜化,越來越來複雜,如果要自己去做的話,估計得多層嵌套了,邏輯非常複雜,那是否有現成的比較簡單的機制呢。
答案就是實現Comparable接口。
具體樣例如下:
public class Student implements Comparable{
private int age;
public Student(int age)
{
this.age = age;
}
@Override
public int compareTo(Object obj) {
Student stu = (Student)obj;
if(this.age>stu.age)
return 1;
else if(this.age<stu.age)
return -1;
else
return 0;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
調用代碼:
public static void main(String[] args) {
TreeSet<Student> treeSet = new TreeSet<Student>();
treeSet.add(new Student(1));
treeSet.add(new Student(3));
treeSet.add(new Student(2));
for(Student student:treeSet)
{
System.out.println(student.getAge());
}
}
輸出結果:
1
2
3
可見自動按照年齡進行了排序,我們再修改一下代碼,讓學生按照年齡由大到排列:
public int compareTo(Object obj) {
Student stu = (Student)obj;
if(this.age>stu.age)
return -1;
else if(this.age<stu.age)
return 1;
else
return 0;
}
輸出結果:
3
2
1
由此可見,這種通過對象實現Comparable接口,結合TreeSet的方式來進行對象排序,還是十分方便的,而且邏輯比較簡單,後續如果有變更,直接修改compareTo方法即可。