黑马程序员技术交流社区
标题:
还是上次TreeSet集合问题,精简了下,大神讲解下吧!!!
[打印本页]
作者:
小歪
时间:
2014-6-12 23:27
标题:
还是上次TreeSet集合问题,精简了下,大神讲解下吧!!!
//以下代码是想撤销TreeSet集合的排序功能,但依旧保留唯一性
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class LoopCircle {
public static void main(String args[])
{
TreeSet<Integer> circle=null;;
circle=new TreeSet<Integer>(new FormerOrder());
int num[]={5,4,3,2,1};
//向set集合中添加两次数组
for(int i=0;i<5;i++){
System.out.println(num
+"添加::"+circle.add(num
));
}
for(int i=0;i<5;i++){
System.out.println(num
+"添加::"+circle.add(num
));
}
if(circle!=null){
Iterator<Integer> iter=circle.iterator();
System.out.print("[");
while(iter.hasNext()){
System.out.print(iter.next()+" ");
}
System.out.print("]");
}
}
}
class FormerOrder implements Comparator<Integer> //自定义比较器
{
public int compare(Integer o1,Integer o2)
{
if(o1==o2)
{
return 0;
}else {
return 1;
}
//return o1.compareTo(o2);
}
}
QQ截图20140612232821.png
(11.14 KB, 下载次数: 44)
下载附件
2014-6-12 23:26 上传
这运行结果是什么情况!~~~
作者:
想飞的鱼
时间:
2014-6-13 01:11
本帖最后由 想飞的鱼 于 2014-6-13 09:33 编辑
class FormerOrder implements Comparator<Integer> //自定义比较器
{
public int compare(Integer o1,Integer o2)
{
if(o1==o2)
{
System.out.println(o1+"......"+o2);
return 0;
}else {
System.out.println(o1+"====="+o2);
return 1;
}
//return o1.compareTo(o2);
}
}
往楼主代码里加入了两条输出语句,结果如下:
5......5
5添加::true
4=====5
4添加::true
3=====5
3=====4
3添加::true
2=====4
2=====3
2添加::true
1=====4
1=====3
1=====2
1添加::true
5=====4
5=====2
5=====1
5添加::true
4......4
4添加::false
3=====4
3=====2
3=====1
3=====5
3添加::true
2=====4
2......2
2添加::false
1=====4
1=====2
1=====5
1=====3
1添加::true
[5 4 3 2 1 5 3 1 ]
发现,添加的时候,这个元素先和谁比不确定,但是不相同都return 1往右走,无法和TreeSet集合中所有的元素比一遍,因此才会出现上述问题的吧?
个人认为这是因为二叉树的数据结构决定的,楼主可供参考
如果非要让TreeSet去除其排序功能,只保留其去除重复功能,鄙人不才,添加了些代码,但是其实也就失去了TreeSet集合的意义吧
//以下代码是想撤销TreeSet集合的排序功能,但依旧保留唯一性
import java.util.*;
public class LoopCircle {
public static void main(String args[])
{
//TreeSet<Integer> temp = new TreeSet<Integer>();//创建一个临时容器,保持和下面的circle“同步”
ArrayList<Integer> temp = new ArrayList<Integer>();//用ArrayList也可以
TreeSet<Integer> circle=null;;
circle=new TreeSet<Integer>(new FormerOrder(temp));
int num[]={5,4,3,2,1};
//向set集合中添加两次数组
for(int i=0;i<5;i++){
System.out.println(num[i]+"添加::"+circle.add(num[i]));
temp.add(num[i]);//每往circle里面添加一个元素,就往temp里面添加一个元素
}
for(int i=0;i<5;i++){
System.out.println(num[i]+"添加::"+circle.add(num[i]));
temp.add(num[i]);
}
if(circle!=null){
Iterator<Integer> iter=circle.iterator();
System.out.print("[");
while(iter.hasNext()){
System.out.print(iter.next()+" ");
}
System.out.print("]");
}
}
}
class FormerOrder implements Comparator<Integer> //自定义比较器
{
private ArrayList<Integer> temp;
FormerOrder(ArrayList<Integer> temp)//构造时,传入temp使其“监视”temp里面都有哪些元素
{
this.temp = temp;
}
public int compare(Integer o1,Integer o2)
{
if(temp.contains(o1))
{
// System.out.println(o1+"......"+o2);
return 0;
}else {
//System.out.println(o1+"====="+o2);
return 1;
}
//return o1.compareTo(o2);
}
}
复制代码
作者:
Ying0558
时间:
2014-6-13 08:14
顶帖,拿币,走人
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2