1. 程式人生 > >TreeSet中類實現compareTo以及內部類中實現compareTo

TreeSet中類實現compareTo以及內部類中實現compareTo

TreeSet作為集合中一個重要的組成,雖說用的沒有ArrayList常見,但還是非常重要的,主要用於非重複集合的排序

先說一下TreeSet,集合中必須包括的是引用型別,若想輸入int,則需要轉化為Inetger,成為引用型別,並且用ComeparTo方法判斷正在輸入的欄位和集合中包括的欄位是否相同,從而確定是輸入還是不輸入

其中有兩種方法,分別為Comparable和 Comparator

其中 Comparable是在類中繼承Comparable介面,主要用於自己建立的類,而 Comparator則主要就是用於系統類(PS:系統類無法修改,無法繼承介面,所以使用內部類實現)

以自己建立的一個類Student為例:

public class Student {
	private String name;
	private int age;
	private int sno;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getSno() {
		return sno;
	}
	public void setSno(int sno) {
		this.sno = sno;
	}
	public Student(String name, int age, int sno) {
		super();
		this.name = name;
		this.age = age;
		this.sno = sno;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", sno=" + sno + "]";
	}
}
先說Comparable: 因為使用Comparable,則需要先使Student繼承介面Comparable,並註明泛型 如:public class Student implements Comparable<Student>{} 因為繼承了Comparable介面,則需實現Compareto方法,說一下我認為的Compareto方法 剛開始我不太清楚Compareto在何時呼叫,在看了Debug之後,注意到了在向TreeSet集合中新增新的引用型別時呼叫的,主要就是判斷新新增的應用型別是否與集合中的引用型別重複,若重複,則不新增,若不重複,則新增。 簡單說一下Compareto方法的實現:
因為Comparable為介面,則重寫CompareTo,如:public int compareTo(Student s),因為在Student的開頭已經確定泛型<Student>,所以這裡預設泛型<Student>,CompareTo是有 int 返回值的,如果返回值為0,則認為正在輸入的應用型別和集合中已有的引用型別重複,若不為0,則輸入集合中。重要的是,這時候的int值並沒有捨棄不用,而是用來判斷集合中順序的重要依據,所謂的正數的就放比較數的前面,負數的就放在比較數的後面,然後挨個與集合每個值相比較,確定自己的位置。所以我們想要有一個按照自己想法的排序時,一定要想好怎麼重寫CompareTo方法,這裡我們用Student舉例,我想讓年齡大的排在前面,若年齡相同,則把學號大的放在前面。我們需要先保證年齡不相同的進行比較,然後輸出年齡的差值,相互比較時確定新輸入學生的位置。如果年齡相同則用同樣的方法比較學號,因為學號是每個人都不同的,所以之後我們不用比較了,CompareTo重寫的程式碼如下: public int compareTo(Student s) {
if(this.age!=s.age){
return s.age-this.age;
}else{
return s.sno-this.sno;
}
}
這裡就是在Comparable中CompareTo方法的重寫,在說一下Comparator Comparator實現的時候主要是因為呼叫的類不好修改,無法繼承,所以這時候我們使用匿名內部類,至於匿名內部類,我回頭再寫一個說一下我的看法,這裡不做詳細介紹 匿名內部類是在new TreeSet的時候使用,在呼叫Comparator介面的時候當然也要重寫ComparaTo的方法,其中方法的重寫與Comparable相同,主要就是CompareTo方法的重寫與匿名類的實現,程式碼如下: TreeSet<Student> set = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s,Student s1) {
if(s.getAge()!=s1.getAge()){
return s.getAge()-s1.getAge();
}else{
return s.getSno()-s1.getSno();
}
}
});
Comparable和 Comparator的差別並不大,只是在呼叫類中實現或者是在匿名類中實現的差別而已。我認為重要的是CompareTo方法的重寫,有什麼不足的請大家指教0.0