黑马程序员技术交流社区
标题: TreeSet集合里的问题 [打印本页]
作者: 程洋 时间: 2013-12-18 09:09
标题: TreeSet集合里的问题
在讲Treeset集合保证唯一性的依据时,老师说是根据copareTo()的方法来保证的,这个方法的方法体到底是什么?(个人猜测:比较字符串的自然顺序?),比如说HashSet是根据元素的哈希值和内容来保持一致的,TreeSet是什么
作者: 发哥-阿花 时间: 2013-12-18 09:26
可能那几段关于TreeSet的视频你还没看完或看懂,多看俩遍,带着问题;
类实现Comparable接口,并重写了方法compareTo;TreeSet集合在排序时,会调用元素的compareTo方法对元素进行判断,这个方法会返回正数、负数或者0;当返回0时,两个元素相同;
重写compareTo方法时,可以根据元素自身的属性来返回数值;返回0时,要再进行次要条件的判断;
有点乱,希望看得懂
作者: 松毛 时间: 2013-12-18 10:11
TreeSet保证元素唯一性的依据是compareTo方法return 0.
TreeSet的第一种排序方式:让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法。该顺序也被称为元素的自然顺序或者默认顺序。如下示例:当返回0时,代表两个对象相同,当存入的时候第二个对象就不会存入(当然,这个方法中还要判读次要条件的,一般也都要判断一下次要条件)。当返回的不是0时,则会根据num的正负值来将他们排序。
- public int compareTo(Student s) {
- int num = new Integer(this.age).compareTo(new Integer(s.age));
- if(num == 0)
- return this.name.compareTo(s.name);
- return num;
- }
复制代码
TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需的时,这时就需要让集合自身具备比较性。 实现方式:在集合初始化时,就让其具备比较性。即定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
这种方式中的compare方法也还是在调用compareTo方法在比较,再根据其返回值来排序。
- class MyCompare implements Comparator//定义一个比较器,让其实现Comparator接口;
- {
- public int compare(Object o1,Object o2)//覆盖Comparator中的compare方法,
- { //让其按照我们自定义的放将对象进行比较;
- Student s1 = (Student)o1;
- Student s2 = (Student)o2;
- int num = s1.getName().compareTo(s2.getName());
- if(num == 0) //当名字相同时,再继续比较年龄,按年龄大小进行排序;
- return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
- return num; //将学生的年龄进行封装,再做比较;
- }
- }
复制代码
作者: smileven 时间: 2013-12-18 12:50
元素不能重复就需要让元素具备比较性。
如果要比较的元素具备比较性,就可以让元素实现Comparable接口并覆盖compareTo方法。
这个一般是对于基本的数据类型,比如年龄大小(int型)和姓名(字符串)都可以进行比较。
当比较的返回值为0时,说明比较的对象是相同的。不为0时根据返回值的正负对元素进行排序。
当然比较的时候还会分比较的主要条件和次要条件。
如果要比较的元素不具备比较性,那么可以让集合具备比较性。
即对集合元素对象的一些详细属性进行比较。代替对两个集合对象的比较。
这样在细节上其实也是在调用compareTo方法。
比如:两个学生在系统里面是不具有比较性的,但是学生在系统里面的确是不一样的。
这时我们可以比较学生的学号这个属性对学生进行比较和区分。
方法是:在集合初始化之前定义一个比较器,将比较器作为参数传递给集合的构造函数。
具体代码实现看楼上。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |