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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 希望的曙光 中级黑马   /  2013-1-17 12:32  /  1746 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

TreeSet集合第一种排序方式:让元素实现Comparable接口,并覆盖其中的compareTo方法,使元素自身具备比较性。
TreeSet集合第二种排序方式:定义一个比较器,实现Comparator接口,并覆盖其中的compare方法。再将定义的比较器对象作为参数传递给TreeSet集合的构造函数。
这两种排序方式有什么不同?哪一种排序方式更好?另外,Set集合是无序的,能不能通过排序让Set集合实现元素的存入顺序与取出顺序一致?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

6 个回复

倒序浏览
一个是让元素自己有比较性;一个是让集合有比较性。推荐使用Comparator。
想要存入和取出的顺序一致可以使用LinkedHashSet

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
那Set集合的排序问题那
回复 使用道具 举报
第一种是在定义元素的时候就让元素重写了Comparable借口的compareTo方法,
第二种在定义集合的时候重写Comparator接口的compare方法,
区别是:有些类已经实现了compareTo方法,但是这些类的compareTo方法我们不满意所以就需要重写这个类的方法
举例:String类已经实现compareTo方法,实现了字符串按从a--z的排序,现在我们想要字符串按从z--a的排序,这时候第一种就无法实现我们的要求,使用第二种,在定义集合的时候重写Comparator接口的compare方法,来实现我们的要求。

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

在你往集合中存放元素的时候,就已经把你存入的数据进行了排序,所以你取出的数据都是已经排序后的数据,不可能与你存入时的数据顺序相同。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
王溢君 来自手机 中级黑马 2013-1-17 23:49:36
报纸
毕老师视频里不是说的很清楚吗?另外存入相同的话,重写的方法里返回1,就可以实现。
回复 使用道具 举报
第一个问题楼上几位的回答我想你已经清楚了,那我来回答你这个问题,
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. }
复制代码
回复 使用道具 举报
给你一个更简单的,用比较器法写的。
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

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