黑马程序员技术交流社区

标题: 关于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来实现的,键是不重复的,值为空

首先构造时:
  1. public TreeSet(Comparator<? super E> comparator) {
  2.         backingMap = new TreeMap<E, Object>(comparator);
  3.     }
复制代码
然后赋值:
  1. public TreeMap(Comparator<? super K> comparator) {
  2.         if (comparator != null) {
  3.             this.comparator = comparator;
  4.         } else {
  5.             this.comparator = (Comparator<? super K>) NATURAL_ORDER;
  6.         }
  7.     }
复制代码
当调用put方法时:
  1. @Override public V put(K key, V value) {
  2.         return putInternal(key, value);
  3.     }
复制代码
在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