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次。
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次。
解决方案 »
- applet java.awt.AWTPermission "createRobot" 权限赋予
- 关于调用不同目录下的类
- jTextPane设置为text/html后,我直接将WORD中的文档复制进去,无法成功,怎么办?
- 一个简单存取用户购物bean问题!请高手指教
- 请教java打印.txt文件,急呀~!
- 午饭时结帖,请教:有什么好的工具可以管理项目中的word文档?类似于CVS/vss一样的代码管理方式,check in/out时候 能自动识别修改的哪些内容
- 请问THINKING IN JAVA的第2版和第3版差在什么地方,谢谢
- 20033647java群,欢迎各位大虾来热闹下
- 关于结果集Resultset中记录条数的问题?????
- oracle数据库表新增一条记录,如何通过jms将信息发出!!!!
- 怎样替换字符串
- 线程中new了多个锁实例,出现的不同步问题
treeset和PriorityQueue用compare比较结果实现的原理那一定不一样咯,
自己可以进源码看看。
向你说的每个都和前面的比较的算法,那也写这个的人不要优化下。
个人意见
第一:TreeSet内部使用的排序算法是插入排序
第二:你的元素按升序放入
很遗憾第一点是无法保证的,而且可以明确的是PriorityQueue用的是堆排序算法,所以比较次数应该是O(lgN)级别的不过你纠结这个问题没有任何意义,你所应当做的就是在实现compare方法时让它在任何时候都返回符合语义的值,而不应该去依赖于被调用的顺序