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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陈培果 于 2014-5-10 12:42 编辑
  1. /*
  2. 练习:按照字符串长度排序。
  3. 字符串背身具备比较性。但是他的比较方式不是所需要的
  4. 这是就只能使用比较器
  5. */
  6. import java.util.*;
  7. class TreeSetText
  8. {
  9.         public static void main(String[] args)
  10.         {
  11.                 TreeSet<String> ts=new TreeSet<String>(new StrLenComparator());

  12.                 ts.add("abcd");
  13.                 ts.add("cc");
  14.                 ts.add("cba");
  15.                 ts.add("aaa");
  16.                 ts.add("z");
  17.                 ts.add("hahaha");

  18.                 Iterator<String> it =ts.iterator();

  19.                 while (it.hasNext())
  20.                 {
  21.                         System.out.println(it.next());
  22.                 }
  23.         }
  24. }
  25. class StrLenComparator implements Comparator<String>
  26. {
  27.         public int compare(String o1,String o2)
  28.         {
  29.                 String s1=o1;//将Object类型强行转换成String
  30.                 String s2=o2;
  31.                 /*if (s1.length()>s2.length())
  32.                         return -1;
  33.                 if (s1.length()==s2.length())
  34.                         return 0;
  35.                         *///当长度一样,内容不一样时,再比较次要条件
  36.                 int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));
  37.                 if(num==0)
  38.                         return s1.compareTo(s2);
  39.                 return num;
  40.         
  41.         }
  42. }
  43. /*
  44. 一直没搞懂Comparator和Comparable的关系。迷迷糊糊的。
  45. 求大神给点详细的解析。
  46. */
复制代码


评分

参与人数 1技术分 +1 收起 理由
张然龙 + 1

查看全部评分

6 个回复

倒序浏览
?????????
回复 使用道具 举报
ehuashao 发表于 2014-5-10 08:24
?????????

汗,这个贴发错了,代码弄丢了,我重新编辑一下
回复 使用道具 举报
这个是我做的一点笔记:
Comparable 和 Comparator 都是用来实现集合中元素的比较、排序的。
只是 Comparable 是在集合内部定义的方法实现的排序,而Comparator 是在集合外部实现的排序,
所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。
Comparator位于包java.util下,而Comparable位于包 java.lang下
一.Comparable 是一个对象,本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)
自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序,这里的自然顺序就是实现Comparable接口设定的排序方式。
二.Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。
用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。
TreeSet排序两种方式:

第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。(也称自然顺序)
第二种方式:元素自身不具备或者具备的不是所需要的比较性。这时,让集合自身具备比较性。在集合初始化时,就有了比较方式。(定义比较器,将比较器作为参数传递给TreeSet集合的构造函数)

两种都存在时,以比较器为主
第二种方法实现:
定义一个类,实现Comparator接口,覆盖compare方法。


评分

参与人数 1技术分 +1 收起 理由
张然龙 + 1 很给力!

查看全部评分

回复 使用道具 举报 1 0
楼上的答得很详细了。我就不说了。
回复 使用道具 举报
伍叶竹 发表于 2014-5-10 09:42
这个是我做的一点笔记:Comparable 和 Comparator 都是用来实现集合中元素的比较、排序的。只是 Comparable ...

说得太好了,十分感谢,啵一个
回复 使用道具 举报

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