標籤:http start 有序 構造 each remove final 簡單 navig
Java提高篇(二八)------TreeSet
與HashSet是基於HashMap實現一樣,TreeSet同樣是基於TreeMap實現的。在《Java提高篇(二七)-----TreeMap》中LZ詳細講解了TreeMap實現機制,如果客官詳情看了這篇博文或者多TreeMap有比較詳細的瞭解,那麼TreeSet的實現對您是喝口水那麼簡單。
一、TreeSet定義
我們知道TreeMap是一個有序的二叉樹,那麼同理TreeSet同樣也是一個有序的,它的作用是提供有序的Set集合。通過源碼我們知道TreeSet基礎AbstractSet,實現NavigableSet、Cloneable、Serializable介面。其中AbstractSet提供 Set 介面的骨幹實現,從而最大限度地減少了實現此介面所需的工作。NavigableSet是擴充的 SortedSet,具有了為給定搜尋目標報告最接近匹配項的導航方法,這就意味著它支援一系列的導航方法。比如尋找與指定目標最匹配項。Cloneable支援複製,Serializable支援序列化。
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable
同時在TreeSet中定義了如下幾個變數。
private transient NavigableMap<E,Object> m; //PRESENT會被當做Map的value與key構建成索引值對 private static final Object PRESENT = new Object();
其構造方法
// 預設建構函式。使用該建構函式,TreeSet中的元素按照自然排序進行排列。TreeSet()// 建立的TreeSet包含collectionTreeSet(Collection<? extends E> collection)// 指定TreeSet的比較子TreeSet(Comparator<? super E> comparator)// 建立的TreeSet包含setTreeSet(SortedSet<E> set)
二、TreeSet主要方法
1、add:將指定的元素添加到此 set(如果該元素尚未存在於 set 中)。
public boolean add(E e) { return m.put(e, PRESENT)==null; }
TreeSet的API
boolean add(E object)boolean addAll(Collection<? extends E> collection)void clear()Object clone()boolean contains(Object object)E first()boolean isEmpty()E last()E pollFirst()E pollLast()E lower(E e)E floor(E e)E ceiling(E e)E higher(E e)boolean remove(Object object)int size()Comparator<? super E> comparator()Iterator<E> iterator()Iterator<E> descendingIterator()SortedSet<E> headSet(E end)NavigableSet<E> descendingSet()NavigableSet<E> headSet(E end, boolean endInclusive)SortedSet<E> subSet(E start, E end)NavigableSet<E> subSet(E start, boolean startInclusive, E end, boolean endInclusive)NavigableSet<E> tailSet(E start, boolean startInclusive)SortedSet<E> tailSet(E start)
說明:
(01) TreeSet是有序的Set集合,因此支援add、remove、get等方法。
(02) 和NavigableSet一樣,TreeSet的導航方法大致可以區分為兩類,一類時提供元素項的導航方法,返回某個元素;另一類時提供集合的導航方法,返回某個集合。
lower、floor、ceiling 和 higher 分別返回小於、小於等於、大於等於、大於給定元素的元素,如果不存在這樣的元素,則返回 null。
TreeSet不支援快速隨機遍曆,只能通過迭代器進行遍曆!
TreeSet遍曆測試程式如下:
import java.util.*;/** * @desc TreeSet的遍曆程式 * * @author skywang * @email [email protected] */public class TreeSetIteratorTest { public static void main(String[] args) { TreeSet set = new TreeSet(); set.add("aaa"); set.add("aaa"); set.add("bbb"); set.add("eee"); set.add("ddd"); set.add("ccc"); // 順序遍曆TreeSet ascIteratorThroughIterator(set) ; // 逆序遍曆TreeSet descIteratorThroughIterator(set); // 通過for-each遍曆TreeSet。不推薦!此方法需要先將Set轉換為數組 foreachTreeSet(set); } // 順序遍曆TreeSet public static void ascIteratorThroughIterator(TreeSet set) { System.out.print("\n ---- Ascend Iterator ----\n"); for(Iterator iter = set.iterator(); iter.hasNext(); ) { System.out.printf("asc : %s\n", iter.next()); } } // 逆序遍曆TreeSet public static void descIteratorThroughIterator(TreeSet set) { System.out.printf("\n ---- Descend Iterator ----\n"); for(Iterator iter = set.descendingIterator(); iter.hasNext(); ) System.out.printf("desc : %s\n", (String)iter.next()); } // 通過for-each遍曆TreeSet。不推薦!此方法需要先將Set轉換為數組 private static void foreachTreeSet(TreeSet set) { System.out.printf("\n ---- For-each ----\n"); String[] arr = (String[])set.toArray(new String[0]); for (String str:arr) System.out.printf("for each : %s\n", str); }}
三、最後
由於TreeSet是基於TreeMap實現的,所以如果我們對treeMap有了一定的瞭解,對TreeSet那是小菜一碟,我們從TreeSet中的源碼可以看出,其實現過程非常簡單,幾乎所有的方法實現全部都是基於TreeMap的。
Java - TreeSet源碼解析