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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

TreeSet集合如何保证唯一和排序?其中的排序有自然排序和比较器排序,这两个排序方式有什么区别。

15 个回复

倒序浏览
1.自然排序,是让集合中添加的元素对象实现Comparable接口,并重写该接口中comareTo方法根据返回值,来进行排序
2.比较器排序,是在TreeSet构造中传入一个对象实现Comparator接口,重写compare方法,自定义比较顺序
回复 使用道具 举报 1 0
TreeSet(底层是使用了二叉树数据结构实现,可以对元素进行排序),但是它的存储有点复杂啊:

                              1. 如果往TreeSet添加元素的时候,如果元素本身具备自然顺序的特性,那么treeSet就会按照元素自然顺序的特性进行排序存储。
                              2. 如果往TreeSet添加元素的时候, 如果元素本身不具备自然顺序的特性, 那么元素所属的类就必须要实现Comparable接口,

                                  把元素的比较规则定义在compareTo(T o)方法上。
                             3. 在TreeSet中如果比较的方法返回的是0,该元素则被视为重复元素,不允许添加。
                             4. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而且元素所属的类没有实现Comparable接口, 那么在创建TreeSet对象 的时候就必须要传入一个比较器对象(Comparator)。
  1. class Emp implements Comparable {  
  2.   
  3.     String name;  
  4.       
  5.     int age;  
  6.       
  7.     double salary;  
  8.   
  9.     public Emp(String name, int age, double salary) {  
  10.         this.name = name;  
  11.         this.age = age;  
  12.         this.salary = salary;  
  13.     }  
  14.       
  15.     @Override  
  16.     public String toString() {  
  17.         return "{ 姓名:"+ this.name+" 年龄:"+ this.age+ " 薪水:"+this.salary+"}";  
  18.     }  
  19.   
  20.     /*
  21.      * 元素与元素之间的比较规则定义在COmparaTo方法上。(non-Javadoc)
  22.         返回值:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。  

  23.      */  
  24.     @Override  //  100.52 - 100.32 = 0.2  
  25.     public int compareTo(Object o) {  
  26.         Emp e = (Emp)o;  
  27.         return (int)((this.salary-e.salary)*100);  
  28.     }  
  29. }  
  30.   
  31. //自定义一个比较器类  
  32. class AgeComparator implements Comparator{  
  33.   
  34.     @Override  
  35.     public int compare(Object o1, Object o2) {  
  36.         Emp e1 = (Emp)o1;  
  37.         Emp e2 = (Emp)o2;  
  38.          
  39.         return e1.age - e2.age;  
  40.     }  
  41. }  
  42.   
  43.   
  44.   
  45.   
  46.   
  47. public class Demo3 {  
  48.   
  49.     public static void main(String[] args) {  
  50.         //创建一个比较器对象  
  51.         AgeComparator ageComparator = new AgeComparator();  
  52.          
  53.         TreeSet tree = new TreeSet(ageComparator);  
  54.         tree.add(new Emp("家宝",68,200));  
  55.         tree.add(new Emp("永康",78,100));      
  56.         tree.add(new Emp("习总",58,300));  
  57.         tree.add(new Emp("克强",48,500));  
  58.          
  59.         System.out.println(tree);  
  60.     }  
  61.       
  62. }
复制代码
在我的blog中有写,欢迎指正
http://blog.csdn.net/lizewenhh/article/details/46367805
回复 使用道具 举报
edithe 发表于 2015-6-7 13:23
TreeSet(底层是使用了二叉树数据结构实现,可以对元素进行排序),但是它的存储有点复杂啊:

            ...

谢谢,很受用
回复 使用道具 举报
保证唯一:compareTo()方法返回0.
排序-->两种
1自然排序:.实现comparable,复写compareTo()
2.自定义排序:实现Comparator,复写compare方法
回复 使用道具 举报
自然排序一般是指按字母顺序或者数值大小排序,比如Integer型和字母类的数据就自带了自然排序的功能。比较器排序就是你自己去定义各种数据类型的大小的方法,比如一个Student类就可以只比较其age属性,或者再比完age属性后再加上比较name的长短,或者再加上比较score成绩的高低,总之就是你去定义数据类型的某些属性来进行比较,得出大小值,然后排序。
回复 使用道具 举报
讲的还可以,我居然看懂了。
回复 使用道具 举报
使用树结构实现的,每添加一个元素就会的调用对象的比较方法,比较方法可以很容易实现避免重复,更在存储时,比较存储
回复 使用道具 举报
用集合时你首先要想到:保证唯一性用HashSet    实现自然顺序用TreeSet
回复 使用道具 举报 1 0
.。。。。。路过
回复 使用道具 举报
TreeSet的自然排序是根据集合元素的大小,TreeSet将他们以升序排列。如果需要实现定制排序,例如降序,则可以使用Comparator接口。该接口里包含一个int compare(T o1, T o2)方法,该方法用于比较o1和o2的大小。
   如果需要实现定制排序,则需要在创建TreeSet集合对象时,并提供一个Comparator对象与该TreeSet集合关联,由该Comparator对象负责集合元素的排序逻辑。
回复 使用道具 举报
TreeSet排序的第一种方式:
             让元素自身具备比较性。
             元素需要实现comparable接口,覆盖compareTo方法
             这种方式也称为元素的自然顺序,或者叫做默认顺序
TreeSet的第二种排序方式:
             当元素自身不具备比较性,或者具备的比较性不是所需要的
             这时需要让容器自身具备比较性
             定义了比较器,将比较器对象作为参数传递给TreeSet比较器

点评

谢谢,学习了。  发表于 2015-6-9 07:07
回复 使用道具 举报
乐成 发表于 2015-6-8 20:07
TreeSet的自然排序是根据集合元素的大小,TreeSet将他们以升序排列。如果需要实现定制排序,例如降序,则可 ...

谢谢,说的很详细
回复 使用道具 举报
看看java的源代码吧,TreeSet把这些底层调用的方法都封装起来了。至于两种排序方式就是根据需求按照不同的条件定义比较关系。
回复 使用道具 举报
乐成 发表于 2015-6-8 20:07
TreeSet的自然排序是根据集合元素的大小,TreeSet将他们以升序排列。如果需要实现定制排序,例如降序,则可 ...

谢谢,说的很好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马