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次。

解决方案 »

  1.   

    set不能重复,queue是队列
    treeset和PriorityQueue用compare比较结果实现的原理那一定不一样咯,
    自己可以进源码看看。
    向你说的每个都和前面的比较的算法,那也写这个的人不要优化下。
    个人意见
      

  2.   

    嗯。。应该是Queue和Set的数据结构本身就不同,比较也不一样咯
      

  3.   

    跟“先放”,“后放”没关系,完全取决于内部采用哪种排序算法,至于你所说的输出n*(n-1)/2行是建立在两个假设的前提下:
    第一:TreeSet内部使用的排序算法是插入排序
    第二:你的元素按升序放入
    很遗憾第一点是无法保证的,而且可以明确的是PriorityQueue用的是堆排序算法,所以比较次数应该是O(lgN)级别的不过你纠结这个问题没有任何意义,你所应当做的就是在实现compare方法时让它在任何时候都返回符合语义的值,而不应该去依赖于被调用的顺序