黑马程序员技术交流社区

标题: 关于TreeSet集合排序的问题求解? [打印本页]

作者: 希望的曙光    时间: 2013-1-17 12:32
标题: 关于TreeSet集合排序的问题求解?
TreeSet集合第一种排序方式:让元素实现Comparable接口,并覆盖其中的compareTo方法,使元素自身具备比较性。
TreeSet集合第二种排序方式:定义一个比较器,实现Comparator接口,并覆盖其中的compare方法。再将定义的比较器对象作为参数传递给TreeSet集合的构造函数。
这两种排序方式有什么不同?哪一种排序方式更好?另外,Set集合是无序的,能不能通过排序让Set集合实现元素的存入顺序与取出顺序一致?
作者: 黄锦成    时间: 2013-1-17 12:55
一个是让元素自己有比较性;一个是让集合有比较性。推荐使用Comparator。
想要存入和取出的顺序一致可以使用LinkedHashSet
作者: 希望的曙光    时间: 2013-1-17 15:51
那Set集合的排序问题那

作者: 张敬培    时间: 2013-1-17 16:31
第一种是在定义元素的时候就让元素重写了Comparable借口的compareTo方法,
第二种在定义集合的时候重写Comparator接口的compare方法,
区别是:有些类已经实现了compareTo方法,但是这些类的compareTo方法我们不满意所以就需要重写这个类的方法
举例:String类已经实现compareTo方法,实现了字符串按从a--z的排序,现在我们想要字符串按从z--a的排序,这时候第一种就无法实现我们的要求,使用第二种,在定义集合的时候重写Comparator接口的compare方法,来实现我们的要求。

一般建议使用第二种,从上面的例子中可以看到第二种的好处,可以根据要求随时改变集合中元素的排列顺序

在你往集合中存放元素的时候,就已经把你存入的数据进行了排序,所以你取出的数据都是已经排序后的数据,不可能与你存入时的数据顺序相同。
作者: 王溢君    时间: 2013-1-17 23:49
毕老师视频里不是说的很清楚吗?另外存入相同的话,重写的方法里返回1,就可以实现。
作者: 王溢君    时间: 2013-1-18 20:44
第一个问题楼上几位的回答我想你已经清楚了,那我来回答你这个问题,
Set集合是无序的,能不能通过排序让Set集合实现元素的存入顺序与取出顺序一致?
只要我们重写了TreeSet的compareTo方法,就可以实现。

我们知道TreeSet存入方式是以二叉树的形式,调用底层的compareTo方法,当返回1时大于,0相等,-1小于。
我们知道取出的时候他是按照从小到大取出的,那我们自定义比较方法,让后面存入的数总是大于前面存入的数,就可以了。
也就是说compareTo方法里总是return 1;
  1. import java.util.*;
  2. class  TreeSet3
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                
  7.                 TreeSet ts = new TreeSet();
  8.                 ts.add(new Demo("abcd"));
  9.                 ts.add(new Demo("cc"));
  10.                 ts.add(new Demo("cba"));
  11.                 ts.add(new Demo("z"));
  12.                 ts.add(new Demo("z,,,"));
  13.                 ts.add(new Demo("hahaha"));
  14.                 //这里随便改顺序,后面就按什么顺序输出。
  15.                

  16.                 Iterator it = ts.iterator();
  17.                 while (it.hasNext())
  18.                 {
  19.                         Demo d = (Demo)it.next();
  20.                         System.out.println("d:"+d.getName());
  21.                 }

  22.         }
  23. }

  24. class Demo implements Comparable//该接口强制让对象具备比较性
  25. {
  26.         private String name;
  27.         Demo(String name)
  28.         {
  29.                 this.name = name;
  30.         }

  31.         public String getName()
  32.         {
  33.                 return name;
  34.         }

  35.         public int compareTo(Object obj)
  36.         {
  37.                 return 1;//返回1,大于, 关键点!!!
  38.                 //改为-1,就是反顺序输出
  39.         }
  40. }
复制代码

作者: 王溢君    时间: 2013-1-18 20:57
给你一个更简单的,用比较器法写的。
  1. import java.util.*;
  2. class TreeSet3
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeSet ts = new TreeSet(new  StrLenComparator());
  7.                 ts.add("abcd");
  8.                 ts.add("cc");
  9.                 ts.add("cba");
  10.                 ts.add("z");
  11.                 ts.add("hahaha");

  12.                 Iterator it = ts.iterator();
  13.                 while (it.hasNext())
  14.                 {
  15.                         System.out.println(it.next());
  16.                 }
  17.         }
  18. }

  19. class StrLenComparator implements Comparator
  20. {
  21.         public int compare(Object o1,Object o2)
  22.         {
  23.                 return 1;
  24.         }
  25. }
复制代码





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