/*
* TreeSet存儲對象的時候, 可以排序, 但是需要指定排序的算法
*
* Integer能排序(有預設順序), String能排序(有預設順序), 自定義的類存儲的時候出現異常(沒有順序)
* 如果想把自定義類的對象存入TreeSet進行排序, 那麼必須實作Comparable接口
* 在類上implement Comparable
* 重寫compareTo()方法
* 在方法内定義比較算法, 根據大小關系, 傳回正數負數或零
* 在使用TreeSet存儲對象的時候, add()方法内部就會自動調用compareTo()方法進行比較, 根據比較結果使用二叉樹形式進行存儲
*/
2.TreeSet是依靠TreeMap來實作的。
TreeSet是一個有序集合,TreeSet中的元素将按照升序排列,預設是按照自然排序進行排列,意味着TreeSet中的元素要實作Comparable接口。或者有一個自定義的比較器。
我們可以在構造TreeSet對象時,傳遞實作Comparator接口的比較器對象。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZk92Y5B3bj9CXzV2Zh1WavwVbvNmLzd2bsJmbj5ibv1WbvN2Lc9CX6MHc0RHaiojIsJye.gif)
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());
}
}
}
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZk92Y5B3bj9CXzV2Zh1WavwVbvNmLzd2bsJmbj5ibv1WbvN2Lc9CX6MHc0RHaiojIsJye.gif)
輸出結果:
abc
rst
xyz
列印結果不是和先前加入的順序一樣,它是按照一個字母的排序法進行排序的。這是因為String 類實作了Comparable接口。
如果我們自己定義的一個類的對象要加入到TreeSet當中,那麼這個類必須要實作Comparable接口。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZk92Y5B3bj9CXzV2Zh1WavwVbvNmLzd2bsJmbj5ibv1WbvN2Lc9CX6MHc0RHaiojIsJye.gif)
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;
}
}
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZk92Y5B3bj9CXzV2Zh1WavwVbvNmLzd2bsJmbj5ibv1WbvN2Lc9CX6MHc0RHaiojIsJye.gif)
運作結果:
學号: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。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZk92Y5B3bj9CXzV2Zh1WavwVbvNmLzd2bsJmbj5ibv1WbvN2Lc9CX6MHc0RHaiojIsJye.gif)
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;
}
}
}
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZk92Y5B3bj9CXzV2Zh1WavwVbvNmLzd2bsJmbj5ibv1WbvN2Lc9CX6MHc0RHaiojIsJye.gif)
學号:1 姓名:lisi
學号:2 姓名:zhangsan
學号:3 姓名:mazi
學号:3 姓名:wangmazi