TreeSet 是用來進行集合排序的,請注意他和LinkedHashSet的區別。
TreeSet是按照一定的規則,將加入到集合裡面的數據進行排序,而LinkedHashSet是 嚴格按照你放入集合的順序進行使用。
先看源代碼
package collection.lession4;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
/**
* 老紫竹JAVA提高教程(4)-認識Set集合之TreeSet。<br>
* 此實現的特點是裡面的數據會自然排序或者用指定的排序類排序。
*
* @author 老紫竹 JAVA世紀網(java2000.net)
*
*/
public class Lession4 {
public static void main(String[] args) {
// 測試自然排序
testNature();
// 測試指定排序方式
testComparator();
// 測試特殊的混合對象排序
testMix();
}
public static void testNature() {
// 測試一下數字
TreeSet<Integer> set = new TreeSet<Integer>();
// 反向存入整數數據
for (int i = 10; i >= 1; i--) {
set.add(i);
}
// 輸出看看
// 可以看到數據為自然的數字排序
showSet(set); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// 測試一下字符串
TreeSet<String> set2 = new TreeSet<String>();
// 同樣反向放入
for (int i = 10; i >= 1; i--) {
set2.add(i + "");
}
// 看輸出結果
// 10 的自然排序沒有2高,因為字符'1'小於'2'
showSet(set2); // [1, 10, 2, 3, 4, 5, 6, 7, 8, 9]
// TreeSet裡面的數據因為要排隊
// 所以如果是混合類型數據的數據,如果不能字段轉換
// 將出現異常 java.lang.ClassCastException:
}
public static void testComparator() {
// 同樣測試數字,我們要反向排序
TreeSet<Integer> set = new TreeSet<Integer>(new MyIntegerComparator());
// 反向存入整數數據
for (int i = 10; i >= 1; i--) {
set.add(i);
}
// 輸出看看
// 可以看到數據為我們期望的反向排序了
showSet(set); // [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
// 我們指定更奇怪的排序,奇數在前面,偶數在後面
// 我們使用匿名內部類
TreeSet<Integer> set2 = new TreeSet<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 % 2 != 0) {
if (o2 % 2 != 0) {
return o2.compareTo(o1);
}
return -1;
}
if (o2 % 2 != 0) {
return 1;
}
return o2.compareTo(o1);
}
});
// 反向存入整數數據
for (int i = 10; i >= 1; i--) {
set2.add(i);
}
// 輸出看看
// 可以看到數據,技術的在前面,且從大到小排序
// 偶數在後面,也是從大到小排序
showSet(set2); // [9, 7, 5, 3, 1, 10, 8, 6, 4, 2]
}
/**
* 混合對象,你要為每個對象類型進行計較控制,避免出現轉換異常.
*/
public static void testMix() {
// 我們測試混合類型的對象,比如字符串和整數
// 如果我們不指定自己的比較器,而使用默認的自然比較器
// 將發生異常
TreeSet set = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
// 我們用字符串比較好了
return o1.toString().compareTo(o2.toString());
}
});
for (int i = 10; i >= 1; i--) {
set.add(i); // 存入整數
set.add(i + ""); // 存入字符串
}
// 輸出看看
// 裡面的內容確實按照字符串進行排序了。
// 數字被轉化為字符串再參與比較。
showSet(set); // [1, 10, 2, 3, 4, 5, 6, 7, 8, 9]
}
/**
* 顯示Set裡面的數據。
*
* @param set
*/
private static void showSet(Set set) {
System.out.println(Arrays.toString(set.toArray()));
}
}
// 注意,我指定了強制類型的比較器
class MyIntegerComparator implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);// 使用反向的比較
}
}
測試:
1 默認排序要求裡面的數據類型必須能互相自由轉換(實際上就應該是一個類型才行), 我們測試如下代碼看看運行錯誤
// 支持混合類型
TreeSet set = new TreeSet();
// 放入混合數據
for (int i = 10; i >= 1; i--) {
set.add(i); // 存入整數
set.add(i + ""); // 存入字符串
}
2 測試讓所有的排序都反向,比如以前是從小到大,變成從大到小。奇數靠前變成偶 數考前。
總結:
當你需要讓集合進行有一定排序規則的使用時,記得用這個。不過我個人更喜歡用 List,必要時用sort方法進行排序。