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。* 此实现的特点是里面的数据会自然排序或者用指定的排序类排序。* * @* */public class Lession4 {  public static void main(String[] args) {   // 测试自然排序   testNature();   // 测试指定排序方式   testComparaTor();   // 测试特殊的混合对象排序   testMix();  }  public static void testNature() {   // 测试一下数字   TreeSet set = new TreeSet();   // 反向存入整数数据   for (int i = 10; i >= 1; i--) {    set.add(i);   }   // 输出看看   // 可以看到数据为自然的数字排序   showSet(set); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]   // 测试一下字符串   TreeSet set2 = new TreeSet();   // 同样反向放入   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 set = new TreeSet(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 set2 = new TreeSet(new ComparaTor() {    @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 {  @Override  public int compare(Integer o1, Integer o2) {   return o2.compareTo(o1);// 使用反向的比较  }}

测试:

1 默认排序要求里面的数据类型必须能互相自由转换(实际上就应该是一个类型才行), 我们测试如下代码看看运行错误

// 支持混合类型   TreeSet set = new TreeSet();   / 却不去主动改变,而是放任它的生活态度。

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

相关文章:

你感兴趣的文章:

标签云: