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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高波 中级黑马   /  2013-7-25 21:32  /  1198 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高波 于 2013-7-26 09:52 编辑

注释部分关于o1,o2换位置使打印字符串的顺序就变了,为什么?希望给个详细点的说明,一直纠结没想明白
  1. import java.util.*;
  2. class GenericDemo2
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeSet<String> ts = new TreeSet<String>(new LenComparator());

  7.                 ts.add("abcd");
  8.                 ts.add("cc");
  9.                 ts.add("cba");
  10.                 ts.add("aaa");
  11.                 ts.add("z");
  12.                 ts.add("hahaha");

  13.                 Iterator<String> it = ts.iterator();
  14.                 while(it.hasNext())
  15.                 {
  16.                         String s = it.next();
  17.                         System.out.println(s);
  18.                 }
  19.         }
  20. }


  21. class LenComparator implements Comparator<String>
  22. {
  23.         public int compare(String o1,String o2)
  24.         {
  25.                 int num = new Integer(o2.length()).compareTo(new Integer(o1.length()));//这里为什么o1,o2换位置字符串打印顺序就变了,一直没想明白

  26.                 if(num==0)
  27.                         return o2.compareTo(o1);
  28.                 return num;
  29.         }
  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

2 个回复

倒序浏览
o1,o2一个代表要进入TreeSet的数,一个代表已经在TreeSet中被比较的数,交换了o1 , o2 ;  TreeSet中的元素存储当然会不一样了,嘿嘿。
在比较器Comparator中复写compare(String o1,String o2)方法时,就是看返回值的,当返回值是正数时,就放在右子树上,当返回时负数时,就放到左子树上(还会一层一层的比较下去)。

其实TreeSet的底层是二叉树,。例如这个题中,是按照String长度来排列的,当一个对象进入集合TreeSet时,都会先和集合中已经存在的String对象比较,当长度小于被比较的元素时,就继续和左子树比较...就这样一直比较下去,直到找到适合的位置。
画个图,就好理解了。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
补充楼上说的,
o1代表新进入的元素,o2代表已经在的元素  ,新进的元素往右边放还是往左边放要看比较器返回的是正数,还是负数,返回正数往右边放,负数往左边放。


举个例子,当新元素进集合时,假如新元素o1比已经存在的o2小,o1<o2,比较器返回负数,新元素往左边放。而如果比较器里面是让已经存在o2比新元素o1,比较器当然会返回一个正数,那么实际上比老元素要小的就会往右边放了。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

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