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