A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程洋 中级黑马   /  2013-12-18 09:09  /  1078 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在讲Treeset集合保证唯一性的依据时,老师说是根据copareTo()的方法来保证的,这个方法的方法体到底是什么?(个人猜测:比较字符串的自然顺序?),比如说HashSet是根据元素的哈希值和内容来保持一致的,TreeSet是什么

评分

参与人数 1黑马币 +5 收起 理由
乔兵 + 5

查看全部评分

3 个回复

倒序浏览
可能那几段关于TreeSet的视频你还没看完或看懂,多看俩遍,带着问题;

类实现Comparable接口,并重写了方法compareTo;TreeSet集合在排序时,会调用元素的compareTo方法对元素进行判断,这个方法会返回正数、负数或者0;当返回0时,两个元素相同;

重写compareTo方法时,可以根据元素自身的属性来返回数值;返回0时,要再进行次要条件的判断;

有点乱,希望看得懂

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报

TreeSet保证元素唯一性的依据是compareTo方法return 0.

       TreeSet的第一种排序方式:让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法。该顺序也被称为元素的自然顺序或者默认顺序。如下示例:当返回0时,代表两个对象相同,当存入的时候第二个对象就不会存入(当然,这个方法中还要判读次要条件的,一般也都要判断一下次要条件)。当返回的不是0时,则会根据num的正负值来将他们排序。

  1. public int compareTo(Student s) {
  2.                 int num = new Integer(this.age).compareTo(new Integer(s.age));
  3.                 if(num == 0)
  4.                         return this.name.compareTo(s.name);
  5.                 return num;
  6.         }
复制代码

       TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需的时,这时就需要让集合自身具备比较性。 实现方式:在集合初始化时,就让其具备比较性。即定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

这种方式中的compare方法也还是在调用compareTo方法在比较,再根据其返回值来排序。

  1. class MyCompare implements Comparator//定义一个比较器,让其实现Comparator接口;  
  2. {  
  3.     public int compare(Object o1,Object o2)//覆盖Comparator中的compare方法,  
  4.     {                                      //让其按照我们自定义的放将对象进行比较;  
  5.         Student s1 = (Student)o1;  
  6.         Student s2 = (Student)o2;         
  7.         int num = s1.getName().compareTo(s2.getName());  
  8.         if(num == 0)  //当名字相同时,再继续比较年龄,按年龄大小进行排序;  
  9.             return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));  
  10.         return num;     //将学生的年龄进行封装,再做比较;  
  11.     }  
  12. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
元素不能重复就需要让元素具备比较性。
如果要比较的元素具备比较性,就可以让元素实现Comparable接口并覆盖compareTo方法。
这个一般是对于基本的数据类型,比如年龄大小(int型)和姓名(字符串)都可以进行比较。
当比较的返回值为0时,说明比较的对象是相同的。不为0时根据返回值的正负对元素进行排序。

当然比较的时候还会分比较的主要条件和次要条件。

如果要比较的元素不具备比较性,那么可以让集合具备比较性。
即对集合元素对象的一些详细属性进行比较。代替对两个集合对象的比较。
这样在细节上其实也是在调用compareTo方法。
比如:两个学生在系统里面是不具有比较性的,但是学生在系统里面的确是不一样的。
        这时我们可以比较学生的学号这个属性对学生进行比较和区分。
方法是:在集合初始化之前定义一个比较器,将比较器作为参数传递给集合的构造函数。
具体代码实现看楼上。

      


评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马