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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

臭豆腐_w

中级黑马

  • 黑马币:8

  • 帖子:34

  • 精华:0

TreeSet存入字符串,按长度排序
  1. import java.util.*;

  2. public class TreeSetText {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 TreeSet ts = new TreeSet(new MCompare());
  9.                 ts.add("adcd");
  10.                 ts.add("ac");
  11.                 ts.add("cc");
  12.                 ts.add("abd");
  13.                 ts.add("a");
  14.                 for(Iterator it = ts.iterator();it.hasNext();){//遍历集合
  15.                         sop(it.next());
  16.                 }
  17.         }
  18.         public static void sop(Object obj){
  19.                 System.out.println(obj);
  20.         }

  21. }

  22. //自定义的比较器
  23. class MCompare implements Comparator{

  24.         @Override
  25.         public int compare(Object o1, Object o2) {
  26.                 // TODO Auto-generated method stub
  27.                 String s1=(String)o1;//转换类型到String,按长度进行比较
  28.                 String s2=(String)o2;
  29.                 int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));//第一种:用封装类
  30.                 //int num = s1.length()-s2.length();//第二种:直接用长度
  31.                 if(num==0)
  32.                         return s1.compareTo(s2);
  33.                 return num;
  34.         }
  35.        
  36. }
复制代码

打印结果都是一样的

10 个回复

倒序浏览
第二种其实应该讲过吧?  我也经常用第二种,不过这样就是把代码写死了, 用在这种判断长度啊什么的,我感觉可以,
不过,我还是感觉用compareTo比较好点,毕竟他是java内部提供的, 他所比较的东西也比我们这个减法的,强很多啊.

总体来说, 偶尔用用应该可以.
回复 使用道具 举报
王凯路路 发表于 2014-8-15 14:44
第二种其实应该讲过吧?  我也经常用第二种,不过这样就是把代码写死了, 用在这种判断长度啊什么的,我感觉可 ...

讲了,好像不存在代码写死的问题吧,CompareTo是自定义类的时候继承,而Comparator是自定义比较器,用在已有自定义类实现CompareTo接口,而自定义类不可修改。
不知道这个问题是不是要追溯到用封装类的好处?
回复 使用道具 举报
我更倾向于第二种
回复 使用道具 举报
第一种新创建对象再比较,不知是不是比第二种低效?
回复 使用道具 举报
第二种好吧,第一种感觉多余了,第一种就是把int转成了Integer了,只有Integer才有compareTo方法,既然字符串本身已经具备了compareTo方法,就没有必要再转换了吧
回复 使用道具 举报
comparteTo是元素本身自备了自然排序, 自定义比较器是人工赋予规则排序,分主要条件和次要条件的排序;两种排序都存在时,以比较器为主
回复 使用道具 举报
第一种方式好,回为如果字符串长度相同而内容不同的话,少比较了一次。
回复 使用道具 举报
M路 发表于 2014-8-15 18:42
第二种好吧,第一种感觉多余了,第一种就是把int转成了Integer了,只有Integer才有compareTo方法,既然字符 ...

我感觉这是不是要回到用封装类的好处上去?
回复 使用道具 举报
そ花痕ゐ蝶梦 发表于 2014-8-16 11:28
第一种方式好,回为如果字符串长度相同而内容不同的话,少比较了一次。

没看仔细吧,骚年?有字符串长度相同时的比较
回复 使用道具 举报
臭豆腐_w 发表于 2014-8-16 11:36
没看仔细吧,骚年?有字符串长度相同时的比较

我是说可以少比较一次。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马