瞭解TreeSet集合

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);
	}
}

運行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章