Comparator

happysmhzp 2011-05-27 02:31:26
		TreeSet<Integer> treeset = new TreeSet<Integer>(new Comparator<Integer>(){

public int compare(Integer i, Integer j) {
System.out.println("i="+i+",j="+j);
return j-i;

}

});

for(int i=0;i<6;i++){
treeset.add(i);
}


compare(Integer i, Integer j)方法中的参数i 和参数 j 那个是后放的那个数呢?我的输出结果是:
i=1,j=0
i=2,j=0
i=2,j=1
i=3,j=1
i=3,j=2
i=4,j=1
i=4,j=2
i=4,j=3
i=5,j=1
i=5,j=3
i=5,j=4
从上面的输出结果来说 参数i是要往进放的数,j是已经在集合中的数(i始终大于j)。但看看下面这个程序我有点晕了

		Queue<Integer> queue = new PriorityQueue<Integer>(6,new Comparator<Integer>(){

public int compare(Integer i, Integer j) {
//System.out.println("i="+i+",j = "+j);
int result = i%2-j%2;
if(0==result){
System.out.println("i="+i+",j = "+j+",result="+(i-j));
return i-j;
}
System.out.println("i="+i+",j = "+j+",result="+result);
return result;
}

});


for(int i=0;i<6;i++){
queue.offer(i);
}

i=0,j = 1,result=-1
i=0,j = 2,result=-2
i=1,j = 3,result=-2
i=1,j = 4,result=1
i=0,j = 4,result=-4
i=2,j = 5,result=-1

从这个输出来看参数j是要往进放的数据i是已经存在的数据(i始终小于j)。为什么会和上面不一样呢?
还有按我的理解比较的话应该是每放第n个数都应该和前面的n-1 个数进行比较,那么输出的行数应该为n*(n-1)/2但结果却不是啊,而是都小于了这个数。比如说上面的treeset添加6个数应该比较15次啊,为什么它才比较了11次。
...全文
128 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
GuuJiang 2011-05-29
  • 打赏
  • 举报
回复
跟“先放”,“后放”没关系,完全取决于内部采用哪种排序算法,至于你所说的输出n*(n-1)/2行是建立在两个假设的前提下:
第一:TreeSet内部使用的排序算法是插入排序
第二:你的元素按升序放入
很遗憾第一点是无法保证的,而且可以明确的是PriorityQueue用的是堆排序算法,所以比较次数应该是O(lgN)级别的

不过你纠结这个问题没有任何意义,你所应当做的就是在实现compare方法时让它在任何时候都返回符合语义的值,而不应该去依赖于被调用的顺序
wellway 2011-05-28
  • 打赏
  • 举报
回复
hao
happysmhzp 2011-05-28
  • 打赏
  • 举报
回复
等待高手出现 呵呵
安心逍遥 2011-05-27
  • 打赏
  • 举报
回复
呵呵,路过
诚朴勇毅 2011-05-27
  • 打赏
  • 举报
回复
看是升序排列还是降序排列。
exterminator 2011-05-27
  • 打赏
  • 举报
回复
嗯。。应该是Queue和Set的数据结构本身就不同,比较也不一样咯
caofaping 2011-05-27
  • 打赏
  • 举报
回复
set不能重复,queue是队列
treeset和PriorityQueue用compare比较结果实现的原理那一定不一样咯,
自己可以进源码看看。


向你说的每个都和前面的比较的算法,那也。。。写这个的人不要优化下。


个人意见
小贝壳666 2011-05-27
  • 打赏
  • 举报
回复
两个例子一致啊,一个是i放进,一个是j放进

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧