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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 水云间 中级黑马   /  2013-5-26 16:28  /  1623 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在集合框架的学习中,比较器是一个非常重要的知识点,毕老师在这个知识点上用了大篇的时间进行讲解,并且讲了很多实例,然而还有一个问题,我还是没搞懂,在这里说一下,希望童鞋们能帮我一下,看下面代码:
  1. import java.util.*;
  2. class CompareBylen
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeSet ts=new TreeSet(new myCompare());
  7.                 ts.add("dsghjhjkjk");
  8.                 ts.add("hdhdsghjhjkjk");
  9.                 ts.add("hjhjkjk");
  10.                 ts.add("xsjjkkdsghjhjkjk");
  11.                 Iterator it=ts.iterator();
  12.                 while(it.hasNext())
  13.                 {
  14.                    String str=(String)it.next();
  15.                    System.out.println(str);
  16.                 }

  17.         }
  18. }
  19. class myCompare implements Comparator
  20. {
  21.    public int compare(Object o1,Object o2)
  22.         {
  23.              
  24.            String str1=(String)o1;
  25.            String str2=(String)o2;
  26.            if(str1.length()>str2.length())
  27.                    return 1;
  28.            if(str1.length()==str2.length())
  29.                    return 0;
  30.            return -1;
  31.     }
  32. }
复制代码
上述代码实现的是一个字符串按长度进行排序,我想不明白的是主函数里的TreeSet集合并没有去调用下面的比较器,他是如何按照下面比较器里的内容排序的呢

3 个回复

倒序浏览
比较器作为参数传入了你new的TreeSet集合内。其实已经调用了比较器,只不过这部分被封装了,你看不到过程而已。你可以在比较器里写一些输出语句观看比较过程。
回复 使用道具 举报
王靖远 发表于 2013-5-26 16:36
比较器作为参数传入了你new的TreeSet集合内。其实已经调用了比较器,只不过这部分被封装了,你看不到过程而 ...

明白了,非常感谢
回复 使用道具 举报
本帖最后由 student 于 2013-5-26 16:45 编辑

TreeSet有一个构造方法:TreeSet(Comparator<? super E> comparator)

它接收一个比较器作为参数,你的例子中myCompare就是一个比较器,比较器需要实现Comparator接口,并且覆盖compare方法。
用户可以自定义自己的比较器,并在compare方法自定义排序规则。如果创建TreeSet集合对象没有传入一个比较器,默认使用TreeSet

集合内部的规则对插入到集合中的元素进行排序。如果传入一个比较器,则使用该比较器的排序规则。你在创建TreeSet集合时,
传入了myCompare比较器,所以集合中的元素按照字符串长度进行排序。


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