在 大多數的java項目中,我們都會用到Java的集合,如 Collection和Map接口。其中用到它們最多的實作類一般要數HashSet,ArrayList,HashMap, 對于 TreeSet,LinkList,TreeMa p這 些類一般人可能會相對用得少了.其實這些實作類還是非常有用的。這裡 阿堂就和您一起去探個究 經吧,看看它們是 何方神聖!
TreeSet是SortedSet接口的唯一實作,TreeSet可以確定集合元素處于排序狀态.TreeSet提供了一些額外的方法
Comparator comparator() :傳回目前Set使用的Comparator, 或者傳回null,表示以自然方式排序.
Object first() :傳回集合中的第一個元素.
Object last() :傳回集合中最末一個元素.
SortedSet headSEt(toElement): 傳回此Set的子集,由小于toElement的元素組成.
SortedSet tailSet(fromElement): 傳回此Set的子集,由大于或等于fromElement的元素組成.
SortedSet subSet(fromElement,toElement): 傳回此Set的子集合,範圍由fromElement( 包含)到toElement(不包含).
特别強調一點:
Treeset中的元素是有序的.
下面我們來看一個TreeSet的通知方法
import java.util.*;
public class TestTreeSetCommon
{
public static void main(String[] ar gs)
{
TreeSet nums = new TreeSet();
//向TreeSet中添 加四個Integer對象
nums.add(5);
nums.add(2);
nums.add(10);
nums.add(-9);
//輸出集合元素,看到集合元素已經處于排序狀态
System.out.println(nums);
//輸出集合裡的第一個元素
System.out.println(nums.first());
//輸出集合裡的最後一個元素
System. out.println(nums.last());
//傳回小于4的子集,不包含4
System.out.println(nums.headSet(4));
//傳回大于5的子集,如果Set中包含5,子集中還包含5
System.out.println(nums.tailSet(5));
//傳回大于等于-3,小于4的子集。
System.out.println(nums.subSet(-3 , 4));
}
}
根據上述結果,我們不難看出:TreeSet并不 是根據元素的插入順 序來排序的,而是根據元素 的實際值來排序的.
特别說明
(1)與HashSet集合采用hash算法來決定元素的存儲位置不同,TreeSet采用紅黑樹的資料結構對元素進行排序。
(2)TreeSet支援兩種排序方法:自然排序和定制排序
(3)紅黑樹是一個更高效的檢索二叉樹,是以常常用來實作關聯 數組。典型地,JDK提供的集合類TreeMap本身就是一個紅黑樹的實作.
(4)對于TreeSet集合而言,它判斷兩個對象不相等的标準是:兩個對象通過equals方法比較傳回false,或通過compareTo(Object obj)比較沒有傳回0(即使兩個 對象是同一個對象)
TreeSet支援的兩種排序方式
(1)自然排序
TreeSet會調用集合元素的compareTo(Object obj)方法來比較兩個元素之間的大小關系,然後将集合元素按升序排列,這種方式就是自然排序.
Java提供了一個Comparable接口,該接口裡定義了一個compareTo(Object obj)方法,該方法傳回一個整數值,實作該接口的類必須實作該方法,實作了該接口的類的對象就可以比較大小.
import java.util.*;
class R implements Comparable
{
int count;
public R(int count)
{
this.count = count;
}
pu blic String toString()
{
return "R(count屬性:" + count + ")" ;
}
public boolean equals(Objec t obj)
{
if (obj instanceof R)
{
R r = (R)obj;
if (r.co u nt == this.count)
{
return true;
}
}
return false;
}
pub lic int compareTo(Object ob j)
{
R r = (R)obj;
if (this .co unt > r .count)
{
return 1;
}
else if (this.count == r.count)
{
return 0;
}
else
{
return -1;
}
}
}
public c lass TestTreeSet2
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new R(5));
ts.add(new R(-3));
ts.add(new R(9));
ts.add(new R(-2));
//列印TreeSet集合,集合元素是有序排列的
System.out.println(ts);
//取出第一個元素
R firs t = (R)ts.first();
//為第一個元素的count屬性指派
first.count = 20;
//取出最後一個元素
R last = (R)ts.last();
//為最後一個元素的count屬 性指派,與倒數第二個元素count屬性相同
last.count = -2;
//再次輸出count将看到TreeSet 裡的元素處于無序狀态,且有重複元素
System. out.println(ts);
//删除屬性被改變的元素,删除失敗
ts.remove(new R(-2));
System.out.println(ts);
//删除屬性沒有改變的元素,删除成 功
ts.remove(new R(5));
Sy stem.out.println(ts);
}
}
注意 :
當 需要把一個對象放入一個TreeSet中時,重寫該對象對應類的equals()方法時,應保證該方法與compareTo(Object obj)方法有一緻的結果人, 其規則是:如果兩個 對象通過equals方法比較 傳回true時,這兩個對象通過compareTo(object obj)方法應傳回0.
(2)定制排序
TreeSet的自然排 序是根據集合元素的大小,TreeSet将它 們以升序排列。如果需要實作定制排序,例如以降序排列,則可以使用 Comparator接口的幫助.
該接口裡包含一個int compare(T o1,T o2)方法,該方法用于比較o1和o2的大小:如果該方法傳回正整數,則表明o1大于o2;如果該方法傳回0,則表明o1等于o2;如果該方法傳回負整數,則表明o1小于o2.
下面的邏輯剛好相反,就實作了降序
import java.util.*;
class M
{
int age;
public M(int age)
{
this.age = age;
}
public String toString(){
return "M對象(age:"+ age +")";
}
}
public class TestTreeSet3
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new Comparato r()
{
public int compare(Object o1, Object o2)
{
M m1 = (M)o1;
M m2 = (M)o2;
if (m1.age > m2.age)
{
return -1;
}
else if (m1.age == m2.age)
{
return 0;
}
else
{
return 1;
}
}
});
ts.add(new M(5));
ts.add(new M(-3));
ts.add(new M(9));
System.out.println(ts);
}
}
轉自:http://blog.sina.com.cn/s/blog_4c925dca0100qh2d.html
時空網絡的部落格