JAVA提高教程(4)-认识Set集合之TreeSet

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);// 使用反向的比较
  }

}

时间: 2024-09-17 04:24:30

JAVA提高教程(4)-认识Set集合之TreeSet的相关文章

JAVA提高教程(5)-认识Set集合之EnumSet

这个类是1.5开始有的,目前个人使用量几乎为零,因为我很少使用枚举,呵呵.我这 里也是简单介绍一下而已.其使用方式和普通的Set没有区别,只是构造方法有一些特殊 的而已. 1.package collection.lession5; 2. 3.import java.util.Arrays; 4.import java.util.EnumSet; 5.import java.util.Set; 6. 7./** 8. * 老紫竹JAVA提高教程(5)-认识Set集合之EnumSet.<br>

JAVA提高教程(3)-认识Set集合之LinkedHashSet

有序的集合,就是LinkedList,内部通过双向链表实现,LinkedHashMap为基础. package collection.lession3; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; /** * 老紫竹JAVA提高教程(3)-认识Set集合之LinkedHashSet.<br> * <br> * Link

JAVA提高教程(2)-认识Set集合之HashSet

集合在Java里面的作用非凡,我们常用的有Set,List和Map三种,我们先熟悉一下Set ,特别是HashSet的使用 package collection.lession2; import java.util.HashSet; import java.util.Set; /** * 老紫竹JAVA提高教程(2)-认识Set集合之HashSet.<br> * Set用来保存不允许重复的数据.可以是任何对象类型.<br> * JDK5以后,主类型可以通过autobox 放入Set

JAVA提高教程(1)-认识Set集合

集合的基本介绍,全在代码里了.不同的实现,细节不同,使用时稍微注意点就行了 .幸好我们常用的就那么几个. package collection.lession1; import java.util.EnumSet; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; import java.util.TreeSet; /** * 老紫竹

JAVA提高教程(11)-认识Map

Map可以为某些数据提供快速查找功能,通过关键字(key)可以快速的得到对应的 Value,而不用像List那样需要大范围的遍历或特别的算法. 1. 源代码 1.import java.util.ArrayList; 2.import java.util.HashMap; 3.import java.util.HashSet; 4.import java.util.Iterator; 5.import java.util.List; 6.import java.util.Map; 7.impor

JAVA提高教程(8)-认识List列表之Vector

Vector和ArrayList的最大区别就是Vector的主要集合方法是线程同步的. 1.package collection.lession8; 2. 3.import java.util.Arrays; 4.import java.util.Collection; 5.import java.util.Enumeration; 6.import java.util.Iterator; 7.import java.util.List; 8.import java.util.Vector; 9

JAVA提高教程(6)-认识List列表

列表是很常用的数据结构,感觉比Map和Set用的频率要高一些吧,因为我经常用其返 回数据库的操作结果集 package collection.lession6; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Stack; import

JAVA提高教程(14)-认识Map之LinkedHashMap

Java基础及提高教程目录 Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序.此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表.此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序).注意,如果在映射中重新插入 键,则插入顺序不受影响.(如果在调用 m.put(k, v) 前 m.containsKey(k) 返回了 true,则调用时会将键 k 重新插入到映射 m 中.) 此实现可以让客户避免未指定的.由 HashMap(及

JAVA提高教程(13)-认识Map之Hashtable

这个类,在使用上和HashMap的区别不大,其方法都是同步的(Synchronized). 1.package collection.lession13; 2. 3.import java.util.Hashtable; 4. 5./** 6. * 老紫竹JAVA提高教程(13)-认识Map之Hashtable<br> 7. * 这个类继承自一个已经过期不推荐使用的Dictionary类<br> 8. * 目前均推荐实现Map接口<br> 9. * 10. * 11.