黑马程序员技术交流社区

标题: 还是上次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);
        }
}





这运行结果是什么情况!~~~



作者: 想飞的鱼    时间: 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集合的意义吧
  1. //以下代码是想撤销TreeSet集合的排序功能,但依旧保留唯一性

  2. import java.util.*;
  3. public class LoopCircle {
  4.         public static void main(String args[])
  5.         {
  6.                                 //TreeSet<Integer> temp = new TreeSet<Integer>();//创建一个临时容器,保持和下面的circle“同步”
  7.                                 ArrayList<Integer> temp = new ArrayList<Integer>();//用ArrayList也可以

  8.                 TreeSet<Integer> circle=null;;
  9.                 circle=new TreeSet<Integer>(new FormerOrder(temp));      
  10.                 int num[]={5,4,3,2,1};
  11.                
  12.                 //向set集合中添加两次数组
  13.                 for(int i=0;i<5;i++){
  14.                                                 
  15.                         System.out.println(num[i]+"添加::"+circle.add(num[i]));
  16.                                                 temp.add(num[i]);//每往circle里面添加一个元素,就往temp里面添加一个元素
  17.                 }
  18.                
  19.                 for(int i=0;i<5;i++){
  20.                                                 
  21.                         System.out.println(num[i]+"添加::"+circle.add(num[i]));
  22.                                                 temp.add(num[i]);
  23.                 }
  24.                
  25.                 if(circle!=null){
  26.                         Iterator<Integer> iter=circle.iterator();
  27.                         System.out.print("[");
  28.                         while(iter.hasNext()){
  29.                                 System.out.print(iter.next()+"  ");
  30.                         }
  31.                         System.out.print("]");
  32.                 }
  33.         }
  34. }

  35. class FormerOrder implements Comparator<Integer>        //自定义比较器
  36. {
  37.                 private ArrayList<Integer> temp;
  38.                 FormerOrder(ArrayList<Integer> temp)//构造时,传入temp使其“监视”temp里面都有哪些元素
  39.                 {
  40.                         this.temp = temp;
  41.                 }
  42.         public int compare(Integer o1,Integer o2)
  43.         {
  44.                 if(temp.contains(o1))
  45.                 {
  46.                                        // System.out.println(o1+"......"+o2);
  47.                         return 0;
  48.                 }else {
  49.                                         //System.out.println(o1+"====="+o2);
  50.                         return 1;
  51.                 }
  52.                 //return o1.compareTo(o2);
  53.         }
  54. }
复制代码



作者: Ying0558    时间: 2014-6-13 08:14
顶帖,拿币,走人




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2