關於TreeSet的排序問題
阿新 • • 發佈:2018-12-25
在大多數的java專案中,我們都會用到Java的集合,如
Collection和Map介面。其中用到它們最多的實現類一般要數HashSet,ArrayList,HashMap,對於TreeSet,LinkList,TreeMap這些類一般人可能會相對用得少了.其實這些實現類還是非常有用的。這裡阿堂就和您一起去探個究經吧,看看它們是何方神聖!
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[] args)
{
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;
}
public
String toString()
{
return
"R(count屬性:" + count + ")";
}
public
boolean equals(Object obj)
{
if
(obj instanceof R)
{
R
r = (R)obj;
if
(r.count
== this.count)
{
return
true;
}
}
return
false;
}
public int
compareTo(Object obj)
{
R
r = (R)obj;
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
{
}
根據上述結果,我們不難看出: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
{