1.TreeSet原理: /* * TreeSet存儲對象的時候, 可以排序, 但是需要指定排序的演算法 * * Integer能排序(有預設順序), String能排序(有預設順序), 自定義的類存儲的時候出現異常(沒有順序) * * 如果想把自定義類的對象存入TreeSet進行排序, 那麼必須實現 ...
1.TreeSet原理:
/*
* TreeSet存儲對象的時候, 可以排序, 但是需要指定排序的演算法
*
* Integer能排序(有預設順序), String能排序(有預設順序), 自定義的類存儲的時候出現異常(沒有順序)
*
* 如果想把自定義類的對象存入TreeSet進行排序, 那麼必須實現Comparable介面
* 在類上implement Comparable
* 重寫compareTo()方法
* 在方法內定義比較演算法, 根據大小關係, 返回正數負數或零
* 在使用TreeSet存儲對象的時候, add()方法內部就會自動調用compareTo()方法進行比較, 根據比較結果使用二叉樹形式進行存儲
*/
2.TreeSet是依靠TreeMap來實現的。
TreeSet是一個有序集合,TreeSet中的元素將按照升序排列,預設是按照自然排序進行排列,意味著TreeSet中的元素要實現Comparable介面。或者有一個自定義的比較器。
我們可以在構造TreeSet對象時,傳遞實現Comparator介面的比較器對象。
import java.util.Iterator; import java.util.*; public class TreeSetTest { public static void main(String[] args) { Set ts = new TreeSet(); ts.add("abc"); ts.add("xyz"); ts.add("rst"); Iterator it = ts.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } }
輸出結果:
abc
rst
xyz
列印結果不是和先前加入的順序一樣,它是按照一個字母的排序法進行排序的。這是因為String 類實現了Comparable介面。
如果我們自己定義的一個類的對象要加入到TreeSet當中,那麼這個類必須要實現Comparable介面。
package test.treeset; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class test_treeset { @SuppressWarnings("unchecked") public static void main(String[] args) { Set ts = new TreeSet(); ts.add(new Teacher("zhangsan", 1)); ts.add(new Teacher("lisi", 2)); ts.add(new Teacher("wangmazi", 3)); ts.add(new Teacher("wangwu",4)); ts.add(new Teacher("mazi", 3)); Iterator it = ts.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } } class Teacher implements Comparable { int num; String name; Teacher(String name, int num) { this.num = num; this.name = name; } public String toString() { return "學號:" + num + "\t\t姓名:" + name; } //o中存放時的紅黑二叉樹中的節點,從根節點開始比較 public int compareTo(Object o) { Teacher ss = (Teacher) o; int result = num < ss.num ? 1 : (num == ss.num ? 0 : -1);//降序 //int result = num > ss.num ? 1 : (num == ss.num ? 0 : -1);//升序 if (result == 0) { result = name.compareTo(ss.name); } return result; } }
運行結果:
學號:4 姓名:wangwu
學號:3 姓名:mazi
學號:3 姓名:wangmazi
學號:2 姓名:lisi
學號:1 姓名:zhangsan
3.比較器
在使用Arrays對數組中的元素進行排序的時候,可以傳遞一個比較器。
在使用Collections對集合中的元素進行排序的時候,可以傳遞一個比較器。
那麼在使用TreeSet對加入到其中的元素進行排序的時候可以傳入一個比較器嗎?
public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<E,Object>(comparator)); }
通過查看它的構造方法就知道可以傳入一個比較器。
構造一個新的空TreeSet,它根據指定比較器進行排序。插入到該 set 的所有元素都必須能夠由指定比較器進行相互比較:對於 set 中的任意兩個元素 e1 和e2,執行 comparator.compare(e1, e2) 都不得拋出 ClassCastException。如果用戶試圖將違反此約束的元素添加到 set 中,則 add 調用將拋出 ClassCastException。
package test.treeset; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; public class TreeSetTest { @SuppressWarnings("unchecked") public static void main(String[] args) { TreeSet ts = new TreeSet(new Teacher2.TeacherCompare()); ts.add(new Teacher2("zhangsan", 2)); ts.add(new Teacher2("lisi", 1)); ts.add(new Teacher2("wangmazi", 3)); ts.add(new Teacher2("mazi", 3)); Iterator it = ts.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } } class Teacher2 { int num; String name; Teacher2(String name, int num) { this.num = num; this.name = name; } public String toString() { return "學號:" + num + " 姓名:" + name; } static class TeacherCompare implements Comparator {// 老師自帶的一個比較器 //o1中存放的事目標節點 //o2中存放時的紅黑二叉樹中的節點,從根節點開始比較 public int compare(Object o1, Object o2) { Teacher2 s1 = (Teacher2) o1;// 轉型 Teacher2 s2 = (Teacher2) o2;// 轉型 int result = s1.num > s2.num ? 1 : (s1.num == s2.num ? 0 : -1); if (result == 0) { result = s1.name.compareTo(s2.name); } return result; } } }
運行結果:
學號:1 姓名:lisi
學號:2 姓名:zhangsan
學號:3 姓名:mazi
學號:3 姓名:wangmazi
文章轉載於:http://www.cnblogs.com/meng72ndsc/archive/2010/12/23/1914477.html