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方法进行排序。
快乐渡过每一天,减肥坚持每一天