通過實現Comparable接口結合TreeSet來對對象自動排序



經過會遇到這樣的情況,對於某個對象數組或者鏈表要按照一定的規則進行排序,那麼我們該怎麼做呢?

如遇到這樣的需求:

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方法即可。


發佈了23 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章