TreeSet類是Set接口的另一個是實現類,TreeSet集合和HashSet集合都可以保證容器內元素的唯一性,但是他們的底層實現方式不同,TreeSet底層使用自平衡的排序二叉樹實現的,所以它既能保證元素的唯一性,也可一堆元素進行排序。
TreeSet還提供了一些特有的方法,如下所示:
- Comparator comparator():如果TreeSet採用定製排序,則返回定製排序所使用的Comparator;如果TreeSet採用自然排序,則返回null。
- Object first():返回集合中的第一個元素。
- Object last():返回集合中最後的一個元素。
- Object lower(Object obj):返回集合中位於obj之前的元素。
- Object higher(Object obj):返回集合中位於obj之後的元素。
- SortedSet subset(Object obj1,Object2):返回此Set的子集合,範圍從obj1到obj2。
- SortedSet headset(Object obj):返回此Set的子集合,返回小於obj。
- SortedSet tailSet(Object obj):返回此Set的子集合,返回大於或等於元素obj。
接下來通過一個demo來了解一下TreeSet。
import java.util.TreeSet;
public class TestTreeSet {
public static void main(String[] args) {
TreeSet treeSet=new TreeSet();
treeSet.add(60);
treeSet.add(360);
treeSet.add(120);
System.out.println(treeSet);
System.out.println(treeSet.subSet(100, 500));
}
}
運行結果:
運行結果說明TreeSet中元素是有序的,且這個順序不是添加時的順序,是根據元素實際值的大小進行排序的。
TreeSet有兩種排序方法:自然排序和定製排序。默認情況下,TreeSet採用的是自然排序。
1、自然排序
TreeSet類會調用集合元素的compareTo(Object obj)方法來比較元素之間的大小關係,然後將集合內元素按升序排列,這就是自然排序。
Java提供了Comparable接口,他裏面定義了一個compareTo(Object obj)方法,實現Comparable接口時必須要實現該方法,在方法中實現對象比較。當該方法被調用時,例如obj1.compareTo(obj2),若該方法返回0,則說明obj1和obj2相等;若返回一個正整數,則說明obj1大於obj2;若該方法返回一個負整數,則說明obj1小於obj2.
另外,向TreeSet集合中添加的應該是同一個類的對象,否則會報ClassCastException異常。
2、定製排序
TreeSet的自然排序是根據集合元素大小,按升序排序,如果需要按特殊規則排序或者元素自身不具備比較性時,就需要用到定製排序,比如按降序排列。Comparator包含一個int compare(T t1,T t2)方法,該方法可以比較t1和t2大小,若返回正整數,則說明t1大於t2;若返回0,則說明t1等於t2;若返回負整數,則說明t1小於t2。
實現TreeSet的定製排序時,只需要在創建TreeSet集合對象時,提供一個Comparator對象於該集合關聯,在compare中編寫排序邏輯。
接下來以一個案例來演示:
import java.util.Comparator;
import java.util.TreeSet;
class Student{
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Student(Integer age) {
this.age = age;
}
public String toString() {
return age+"";
}
}
class MyComparator implements Comparator{ //第一步:實現Comparator接口
//第二步:實現一個compare方法,判斷對象是否特定類的一個實例
public int compare(Object o1,Object o2) {
if(o1 instanceof Student & o2 instanceof Student) {
Student s1=(Student)o1; //強制轉換爲Student類型
Student s2=(Student)o2;
if(s1.getAge()>s2.getAge()) {
return -1;
}
else if(s1.getAge()<s2.getAge()){
return 1;
}
}
return 0;
}
}
public class TestTreeSetSort {
public static void main(String[] args) {
//第三步:創建一個TreeSet集合對象時,提供一個Comparator對象
TreeSet treeSet=new TreeSet(new MyComparator());
treeSet.add(new Student(140));
treeSet.add(new Student(12));
treeSet.add(new Student(15));
System.out.println(treeSet);
}
}
運行結果: