天天看點

關于TreeSet的排序問題

在 大多數的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的排序問題

根據上述結果,我們不難看出: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的排序問題

注意 :

當 需要把一個對象放入一個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);

       }

}

關于TreeSet的排序問題

轉自:http://blog.sina.com.cn/s/blog_4c925dca0100qh2d.html

時空網絡的部落格

繼續閱讀