黑马程序员技术交流社区
标题:
ThreeSet中compareTo方法的疑问
[打印本页]
作者:
高波
时间:
2013-7-25 21:32
标题:
ThreeSet中compareTo方法的疑问
本帖最后由 高波 于 2013-7-26 09:52 编辑
注释部分关于o1,o2换位置使打印字符串的顺序就变了,为什么?希望给个详细点的说明,一直纠结没想明白
import java.util.*;
class GenericDemo2
{
public static void main(String[] args)
{
TreeSet<String> ts = new TreeSet<String>(new LenComparator());
ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("aaa");
ts.add("z");
ts.add("hahaha");
Iterator<String> it = ts.iterator();
while(it.hasNext())
{
String s = it.next();
System.out.println(s);
}
}
}
class LenComparator implements Comparator<String>
{
public int compare(String o1,String o2)
{
int num = new Integer(o2.length()).compareTo(new Integer(o1.length()));//这里为什么o1,o2换位置字符串打印顺序就变了,一直没想明白
if(num==0)
return o2.compareTo(o1);
return num;
}
}
复制代码
作者:
の放下执著
时间:
2013-7-25 22:10
o1,o2一个代表要进入TreeSet的数,一个代表已经在TreeSet中被比较的数,交换了o1 , o2 ; TreeSet中的元素存储当然会不一样了,嘿嘿。
在比较器Comparator中复写compare(String o1,String o2)方法时,就是看返回值的,当返回值是正数时,就放在右子树上,当返回时负数时,就放到左子树上(还会一层一层的比较下去)。
其实TreeSet的底层是二叉树,。例如这个题中,是按照String长度来排列的,当一个对象进入集合TreeSet时,都会先和集合中已经存在的String对象比较,当长度小于被比较的元素时,就继续和左子树比较...就这样一直比较下去,直到找到适合的位置。
画个图,就好理解了。
作者:
李政
时间:
2013-7-25 22:40
补充楼上说的,
o1代表新进入的元素,o2代表已经在的元素 ,新进的元素往右边放还是往左边放要看比较器返回的是正数,还是负数,返回正数往右边放,负数往左边放。
举个例子,当新元素进集合时,假如新元素o1比已经存在的o2小,o1<o2,比较器返回负数,新元素往左边放。而如果比较器里面是让已经存在o2比新元素o1,比较器当然会返回一个正数,那么实际上比老元素要小的就会往右边放了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2