黑马程序员技术交流社区
标题:
关于TreeSet生成时,传入比较器
[打印本页]
作者:
移动小坦克
时间:
2013-3-15 03:59
标题:
关于TreeSet生成时,传入比较器
本帖最后由 韩松范 于 2013-3-15 09:53 编辑
为了让集合自身具备比较功能,我们在生成TreeSet集合时,会传入一个比较器
该比较器说白了,就是一个实现Comparator接口的类生成的对象。该类复写了
int compare(Object o1,Object o2) 方法,那么我想问的是,集合内部是怎样
调用Comparator对象的compare方法的,我想在add方法调用时,肯定是调用了compare方法
有人研究过原代码吗?
作者:
tianyun
时间:
2013-3-15 07:22
//set
public class set
{
private Conparator c;
public set(){};
public set(Comparator c)
{
this.c=c;
}
public void add(Object 0)
{
for(int i=0;i<=this.size();i++)
{
//采用插入排序法,插入该值
}
}
}
作者:
tianyun
时间:
2013-3-15 07:30
补充:插入排序时采用Comparator的比较方法比较大小。
作者:
fighting
时间:
2013-3-15 07:41
刚刚看了看,这个TreeSet是用TreeMap来实现的,键是不重复的,值为空
首先构造时:
public TreeSet(Comparator<? super E> comparator) {
backingMap = new TreeMap<E, Object>(comparator);
}
复制代码
然后赋值:
public TreeMap(Comparator<? super K> comparator) {
if (comparator != null) {
this.comparator = comparator;
} else {
this.comparator = (Comparator<? super K>) NATURAL_ORDER;
}
}
复制代码
当调用put方法时:
@Override public V put(K key, V value) {
return putInternal(key, value);
}
复制代码
在putInternal这个方法里有一个查找节点位置的方法find
在find方法里它会获取到一个comparison的int类型的比较结果
根据判断结果进行排序。(方法比较长,我就不贴了,有兴趣自己查查看)
作者:
移动小坦克
时间:
2013-3-15 09:53
fighting 发表于 2013-3-15 07:41
刚刚看了看,这个TreeSet是用TreeMap来实现的,键是不重复的,值为空
首先构造时:然后赋值:当调用put方 ...
牛。。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2