程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JAVA提高教程(4)-認識Set集合之TreeSet

JAVA提高教程(4)-認識Set集合之TreeSet

編輯:關於JAVA

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方法進行排序。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved