下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

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

作者:课课家教育     来源: http://www.kokojia.com点击数:760发布时间: 2016-02-01 14:20:03

标签: java课程标准21天学通javajava学习课程

大神带你学编程,欢迎选课

  TreeSet 是用来进行集合排序的,请注意他和LinkedHashSet的区别。

  TreeSet是按照一定的规则,将加入到集合里面的数据进行排序,而LinkedHashSet是 严格按照你放入集合的顺序进行使用。

JAVA程序员提高教程(4)-认识Set集合之TreeSet_java课程标准_21天学通java_课课家

  先看源代码

  package collection.lession4;

  import java.util.Arrays;

  import java.util.Comparator;

  import java.util.Set;

  import java.util.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);// 使用反向的比较

  }

  }

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程