黑马程序员技术交流社区

标题: 下面两种方式用哪一种比较好,为什么? [打印本页]

作者: 臭豆腐_w    时间: 2014-8-15 12:33
标题: 下面两种方式用哪一种比较好,为什么?
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. }
复制代码

打印结果都是一样的

作者: 王凯路路    时间: 2014-8-15 14:44
第二种其实应该讲过吧?  我也经常用第二种,不过这样就是把代码写死了, 用在这种判断长度啊什么的,我感觉可以,
不过,我还是感觉用compareTo比较好点,毕竟他是java内部提供的, 他所比较的东西也比我们这个减法的,强很多啊.

总体来说, 偶尔用用应该可以.
作者: 臭豆腐_w    时间: 2014-8-15 17:40
王凯路路 发表于 2014-8-15 14:44
第二种其实应该讲过吧?  我也经常用第二种,不过这样就是把代码写死了, 用在这种判断长度啊什么的,我感觉可 ...

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

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

没看仔细吧,骚年?有字符串长度相同时的比较
作者: そ花痕ゐ蝶梦    时间: 2014-8-16 18:45
臭豆腐_w 发表于 2014-8-16 11:36
没看仔细吧,骚年?有字符串长度相同时的比较

我是说可以少比较一次。




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