A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵家阳 中级黑马   /  2012-12-3 18:25  /  1225 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵家阳 于 2012-12-6 16:47 编辑
  1. import java.util.*;
  2. public class TreeSetDemo {
  3.         public static void main(String[] args)
  4.         {        
  5.                 TreeSet ts = new TreeSet();
  6.                 Student st1 = new Student("wangwu001",21);
  7.                 Student st2 = new Student("langwu001",21);
  8.                 Student st3 = new Student("wangwu001",20);
  9.                 Student st4 = new Student("wangwu001",22);
  10.                 ts.add(st1);
  11.                 ts.add(st2);
  12.                 ts.add(st3);
  13.                 ts.add(st4);
  14.                 /*
  15.                 ts.add(new Student("lisi01",18));
  16.                 ts.add(new Student("lisi02",29));
  17.                 ts.add(new Student("lisd01",21));
  18.                 ts.add(new Student("misi01",18));
  19.                 ts.add(new Student("lssi01",19));
  20.                 */
  21.                 Iterator it = ts.iterator();
  22.                 while(it.hasNext())
  23.                 {
  24.                         Student st = (Student)it.next();
  25.                         System.out.println(st.getName()+"======"+st.getAge());
  26.                 }
  27.                
  28.         }
  29. }
  30. class Student implements Comparable
  31. {
  32.         private String name;
  33.         private int age;
  34.         Student(String name,int age)
  35.         {
  36.                 this.name = name;
  37.                 this.age  = age;
  38.         }
  39.         public String getName()
  40.         {
  41.                 return name;
  42.         }
  43.         public int getAge()
  44.         {
  45.                 return age;
  46.         }
  47.         public int compareTo(Object obj)
  48.         {
  49.                 if(!(obj instanceof Student))
  50.                 {
  51.                         throw new RuntimeException("不是学生对象");
  52.                 }
  53.                 Student st = (Student)obj;
  54.                 System.out.println(st.getName()+",......,.."+st.getAge());
  55.                 if(this.age >st.age)
  56.                 {
  57.                         return 1;
  58.                 }
  59.                 if(this.age == st.age)
  60.                 {
  61.                         return this.name.compareTo(st.getName());
  62.                 }
  63.                 return -1;
  64.         }
  65. }
复制代码
疑问:
   在上面两种创建对象的方式结果都是正确的,
   但是,在此处:public int compareTo(Object obj)   其中的obj并没有明确指定是哪个对象,CompareTo方法底层是怎么实现在
比较的过程中能与各个对象进行比较呢?
   求精讲!!!!

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
public int compareTo(T o);这是接口的源代码,里面什么都没写就是一个抽象方法。
如果你的eclips关联了源代码,你可以选中类名按F3来查找java源代码
回复 使用道具 举报
TreeSet底层是TreeMap实现的,下面的代码是TreeMap中的put代码?
里面可以看出在你装入数据的是i和它调用了compare方法来比较你装入的数据
public V put(K key, V value) {
            Entry<K,V> t = root;
            if (t == null) {
                compare(key, key); // 里面没有值的时候本身和本身比较

                root = new Entry<>(key, value, null);
                size = 1;
                modCount++;
                return null;
            }
            int cmp;
            Entry<K,V> parent;
            // split comparator and comparable paths
            Comparator<? super K> cpr = comparator;
                //如果你传入比较器,就按照你的比较代码来比较数据。
//有值的时候新传进来的值和之前的值进行比较。
            if (cpr != null) {
                do {
                    parent = t;
                    cmp = cpr.compare(key, t.key);
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else
                        return t.setValue(value);
                } while (t != null);
            }
            else {
                        //如果你没有传入比较器,就调用你的数据类型的上级比较器,来对数据进行比较。
                if (key == null)
                    throw new NullPointerException();
                Comparable<? super K> k = (Comparable<? super K>) key;
                do {
                    parent = t;
//        新对象调用自己compareTo和之前值进行比较。所以你说的compareTo(Object obj)中的obj是之前存储过的值。具体是哪个应该是你存的数据数据规则决定的。从小到大,那就是之前存储最大的那个。
                    cmp = k.compareTo(t.key);
                               
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else
                        return t.setValue(value);
                } while (t != null);
            }
            Entry<K,V> e = new Entry<>(key, value, parent);
            if (cmp < 0)
                parent.left = e;
            else
                parent.right = e;
            fixAfterInsertion(e);
            size++;
            modCount++;
            return null;
        }



评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
轻松过关 发表于 2012-12-3 20:01
TreeSet底层是TreeMap实现的,下面的代码是TreeMap中的put代码?
里面可以看出在你装入数据的是i和它调用了 ...

不好意思,这点还没有学到,暂时不能做回答! 不过还是谢谢了!
回复 使用道具 举报
抱歉那应该不是问号,我找出来的底层代码!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马