黑马程序员技术交流社区

标题: 关于TreeSet集合中有关compareTo方法的问题 [打印本页]

作者: 蓝蓝的天    时间: 2015-4-23 11:41
标题: 关于TreeSet集合中有关compareTo方法的问题
前辈好!知道TreeSet底层数据结果是二叉树。当向集合添加元素时,会调用compareTo方法和前面的元素进行比较。写了一段程序,是毕老师讲课的那个程序。可是运行结果发现,后面添加的元素并未和前面添加进来的所有元素都比较,这是为什么?代码如下:
  1. /*--TreeSet:可以对Set集合中的元素进行排序。
  2.                                 底层数据结构是二叉树。
  3.                                 保证元素唯一性的依据:
  4.                                 compareTo方法return 0.

  5.                                 TreeSet排序的第一种方式:让元素自身具备比较性。
  6.                                 元素需要实现Comparable接口,覆盖compareTo方法。
  7.                                 也种方式也成为元素的自然顺序,或者叫做默认顺序。

  8.                                 TreeSet的第二种排序方式。
  9.                                 当元素自身不具备比较性时,或者具备的比较性不是所需要的。
  10.                                 这时就需要让集合自身具备比较性。
  11.                                 在集合初始化时,就有了比较方式。
  12. 需求:
  13. 往TreeSet集合中存储自定义对象学生。
  14. 想按照学生的年龄进行排序。


  15. 记住,排序时,当主要条件相同时,一定判断一下次要条件。*/
  16. import java.util.*;
  17. class TreeSetDemo
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.           TreeSet ts = new TreeSet();
  22.           ts.add(new Student("lisi02",22));
  23.                 ts.add(new Student("lisi007",20));
  24.                 ts.add(new Student("lisi09",19));
  25.                 ts.add(new Student("lisi08",19));
  26.                 ts.add(new Student("lisi007",20));
  27.           Iterator it = ts.iterator();
  28.                 while(it.hasNext())
  29.                 {
  30.                         Student stu = (Student)it.next();
  31.                         System.out.println(stu.getName()+"..."+stu.getAge());
  32.                 }
  33.        
  34.         }
  35.        
  36. }
  37. class Student implements Comparable
  38. {
  39.            private String name;
  40.            private int age;
  41.         Student(String name,int age)
  42.         {
  43.          this.name = name;
  44.          this.age = age;       
  45.         }
  46.         public String getName()
  47.         {
  48.          return name;       
  49.         }
  50.         public int getAge()
  51.         {
  52.          return age;       
  53.         }
  54.        
  55.        
  56. public int compareTo(Object obj)
  57. {
  58.          if(!(obj instanceof Student))
  59.          {
  60.                  throw new RuntimeException("该对象不是学生类型");
  61.                  }
  62. Student s = (Student)obj;
  63. System.out.println(this.name+"使用compareTo方法比较了"+s.name);
  64.          int num = this.age-s.age;
  65.          if(!(num==0))
  66.          {
  67.                  return num;
  68.          }
  69.          else
  70.          {       
  71.          return this.getName().compareTo(s.getName());
  72.          }

  73. }
  74. }
  75. /*
  76. G:\代码\集合框架>java TreeSetDemo
  77. lisi02使用compareTo方法比较了lisi02
  78. lisi007使用compareTo方法比较了lisi02
  79. lisi09使用compareTo方法比较了lisi02
  80. lisi09使用compareTo方法比较了lisi007
  81. lisi08使用compareTo方法比较了lisi007
  82. lisi08使用compareTo方法比较了lisi09
  83. lisi007使用compareTo方法比较了lisi007
  84. lisi08...19
  85. lisi09...19
  86. lisi007...20
  87. lisi02...22
  88. */



复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2