黑马程序员技术交流社区
标题: 学习比较器的一些误区 [打印本页]
作者: 水云间 时间: 2013-5-26 16:28
标题: 学习比较器的一些误区
在集合框架的学习中,比较器是一个非常重要的知识点,毕老师在这个知识点上用了大篇的时间进行讲解,并且讲了很多实例,然而还有一个问题,我还是没搞懂,在这里说一下,希望童鞋们能帮我一下,看下面代码:- import java.util.*;
- class CompareBylen
- {
- public static void main(String[] args)
- {
- TreeSet ts=new TreeSet(new myCompare());
- ts.add("dsghjhjkjk");
- ts.add("hdhdsghjhjkjk");
- ts.add("hjhjkjk");
- ts.add("xsjjkkdsghjhjkjk");
- Iterator it=ts.iterator();
- while(it.hasNext())
- {
- String str=(String)it.next();
- System.out.println(str);
- }
- }
- }
- class myCompare implements Comparator
- {
- public int compare(Object o1,Object o2)
- {
-
- String str1=(String)o1;
- String str2=(String)o2;
- if(str1.length()>str2.length())
- return 1;
- if(str1.length()==str2.length())
- return 0;
- return -1;
- }
- }
复制代码 上述代码实现的是一个字符串按长度进行排序,我想不明白的是主函数里的TreeSet集合并没有去调用下面的比较器,他是如何按照下面比较器里的内容排序的呢
作者: 王靖远 时间: 2013-5-26 16:36
比较器作为参数传入了你new的TreeSet集合内。其实已经调用了比较器,只不过这部分被封装了,你看不到过程而已。你可以在比较器里写一些输出语句观看比较过程。
作者: 水云间 时间: 2013-5-26 16:42
王靖远 发表于 2013-5-26 16:36 
比较器作为参数传入了你new的TreeSet集合内。其实已经调用了比较器,只不过这部分被封装了,你看不到过程而 ...
明白了,非常感谢
作者: student 时间: 2013-5-26 16:44
本帖最后由 student 于 2013-5-26 16:45 编辑
TreeSet有一个构造方法:TreeSet(Comparator<? super E> comparator)
它接收一个比较器作为参数,你的例子中myCompare就是一个比较器,比较器需要实现Comparator接口,并且覆盖compare方法。
用户可以自定义自己的比较器,并在compare方法自定义排序规则。如果创建TreeSet集合对象没有传入一个比较器,默认使用TreeSet
集合内部的规则对插入到集合中的元素进行排序。如果传入一个比较器,则使用该比较器的排序规则。你在创建TreeSet集合时,
传入了myCompare比较器,所以集合中的元素按照字符串长度进行排序。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |