赞
踩
TreeSet的底层是TreeMap
和HashSet和HashMap的关系一样
Set接口的实现类
关于Set接口可以看我的Java值单列集合
重点和其他的区别是,可以排序(按照你想要的方式)
当我们使用无参构造器创建TreeSet时
仍然是无序的
如果你希望按照添加的元素按照字符串大小排序
需要使用TreeSet一个构造器可以传入一个比较器Compartor(接口)
使用匿名内部类
但compare返回值只是一个数,要想真正了解怎么进行排序
还是要看源码
TreeSet的底层是TreeMap
把我们传入的比较器传给了TreeMap的一个属性comparator
看add方法的运行比较机制
这里还是TreeSet的put方法
然后到TreeMap的put方法
这里我只截取了put方法里面的比较那一部分
Comparator<? super K> cpr = comparator;//把我们的匿名内部类传给cpr
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key);//调用我们定义的方法
if (cmp < 0)//返回值大于0,左边
t = t.left;
else if (cmp > 0)//返回值小于0,放右边
t = t.right;
else
return t.setValue(value);//等于0的换直接返回
//不会添加
}
key是我们传入的对象
然后t.key是哪个比较的对象
遵循compare规则
key如果和t.key比较返回值大于0
向左放
小于0,向右放
等于0,不添加
默认的话是按字符串的大小排序的大的放前面
就是String的compareTo机制
如果你想按照字符串长度比较
可以这样设计
这里是Entry存放K-V
如果你放两个字符串铲毒相同就放不进去了
源码分析和前面的TreeSet相同
都是静态方法,且直接对集合进行操作
min和max情况差不多不写了
TreeMap和TreeSet
使用无参构造的时候
add/put进去的key值
必须实现Compartor接口
解决方法
让Person实现Compartor接口并重写compareTo方法
注意如果返回值都是0的话只能添加一个new Person()对象
对比相同不添加
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。