黑马程序员技术交流社区

标题: 关于这个TreeSet例子的不解,想知道这段代码的执行顺序,... [打印本页]

作者: dolphin    时间: 2014-1-6 12:27
标题: 关于这个TreeSet例子的不解,想知道这段代码的执行顺序,...
本帖最后由 dolphin 于 2014-1-6 14:15 编辑

这个是代码
  1. package com.itcast.collection;
  2. import java.util.TreeSet;
  3. public class TreeSetTest {
  4.         public static void main(String[] args) {
  5.                 TreeSet set = new TreeSet();
  6.                 set.add(new Child());
  7.                 set.add(new Parent(3));
  8.                 set.add(new Parent(4));
  9.                 set.add(new Parent(5));
  10.                 set.add(new Parent(6));
  11.                 //System.out.println(set.size());
  12.         }
  13. }
  14. class Child extends Parent {
  15.         public Child(){
  16.                 super(110);
  17.         }
  18.         public int compareTo(Object o) {
  19.                         System.out.println("method of child");
  20.                         return 1;
  21.         }
  22. }
  23. class Parent implements Comparable {
  24.         private int age = 0;
  25.         public Parent(int age){
  26.                 this.age = age;
  27.         }
  28.         public int compareTo(Object o) {
  29.                 System.out.println("method of parent");
  30.                 Parent o1 = (Parent)o;
  31.                 System.out.println("age:" + age + "        o1.age:" + o1.age + " o对象:" + o );
  32.                 return age>o1.age?1:age<o1.age?-1:0;
  33.         }        
  34. }
复制代码

这个运行结果是这样的,但不懂为什么会这样,debug调试半天,也没看懂,求高手指点迷津:

作者: L_t    时间: 2014-1-6 13:17

  1. package com;
  2. import java.util.TreeSet;

  3. public class Test {

  4.         public static void main(String[] args) {

  5.                
  6.                 /*
  7.                  * 先变量,再构造,然后方法。但
  8.                  */
  9.                 TreeSet set = new TreeSet();
  10.                 set.add(new Child());
  11.                 set.add(new Parent(3));
  12.                 set.add(new Parent(4));
  13.                 set.add(new Parent(5));
  14.                 set.add(new Parent(6));
  15.                 //System.out.println(set.size());
  16.         }

  17. }
  18. class Child extends Parent {

  19.         public Child(){
  20.                 super(110);
  21.         }
  22.         
  23.         public int compareTo(Object o) {
  24.                         // TODO Auto-generated method stub
  25.                         System.out.println("method of child");
  26. //                        Child o1 = (Child)o;
  27.                         return 1;

  28.         }

  29.                 @Override
  30.                 public String toString() {
  31.                         return "age";
  32.                 }
  33.         
  34. }
  35. class Parent implements Comparable {
  36.         private int age = 0;
  37.         public Parent(int age){
  38.                 this.age = age;
  39.         }
  40.         
  41.         @Override
  42.                 public String toString() {
  43.                         return "age";
  44.                 }

  45.                 public int compareTo(Object o) {
  46.                 System.out.println("method of parent");
  47.                 Parent o1 = (Parent)o;
  48.                 System.out.println("age:" + age + "        o1.age:" + o1.age + " o对象:" + o );
  49.                 return age>o1.age?1:age<o1.age?-1:0;
  50.         }
  51.         
  52. }
  53. 重写toString()方法
复制代码

作者: 李凤鸣    时间: 2014-1-6 13:50
你的输出语句
System.out.println("age:" + age + "        o1.age:" + o1.age + " o对象:" + o );
最后哦一个没有处理
输出的就是对象的地址值

作者: dolphin    时间: 2014-1-6 14:06
L_t 发表于 2014-1-6 13:17

你这边为什么要重写toString方法,这里
我只想知道这段代码的执行顺序,以及为什么这样执行?
作者: dolphin    时间: 2014-1-6 14:11
李凤鸣 发表于 2014-1-6 13:50
你的输出语句
System.out.println("age:" + age + "        o1.age:" + o1.age + " o对象:" + o );
最后 ...

我知道是地址,但是我想贴这代码是想知道这个执行顺序,以及这样执行的原因,你要是看懂了,给我详细说说吧
作者: 李凤鸣    时间: 2014-1-6 14:45
同一个类可以比较
  1. import java.util.*;
  2. public class TreeSetTest {
  3.         public static void main(String[] args) {
  4.                 TreeSet set = new TreeSet();
  5.                // set.add(new Child());
  6.                 set.add(new Parent(9));
  7.                 set.add(new Parent(4));
  8.                 set.add(new Parent(5));
  9.                 set.add(new Parent(6));
  10.                                 Iterator it = set.iterator();
  11.                                 while(it.hasNext())
  12.                                 {
  13.                                         Parent par = (Parent)it.next();
  14.                                         System.out.println(par.getAge());
  15.                                 }
  16.         }
  17. }
  18. class Child extends Parent {
  19.         public Child(){
  20.                 super(1);
  21.         }
  22.         public int compareTo(Object o) {
  23.                      //   System.out.println("method of child");
  24.                         return 1;
  25.         }
  26. }
  27. class Parent implements Comparable {
  28.         private int age = 0;
  29.         public Parent(int age){
  30.                 this.age = age;
  31.         }
  32.                 public int getAge()
  33.             {
  34.                         return age;
  35.                 }
  36.         public int compareTo(Object o) {
  37.                // System.out.println("method of parent");
  38.                 Parent o1 = (Parent)o;
  39.                 System.out.println("age:" + age + " o1.age:" + o1.age );
  40.                 return age>o1.age?1:0;
  41.         }
  42.                
  43. }
复制代码


这样可以求出最大值
最小值的话可以把return改下就可
作者: 李凤鸣    时间: 2014-1-6 15:41
  1. import java.util.*;
  2. public class TreeSetTest {
  3.         public static void main(String[] args) {
  4.                 TreeSet set = new TreeSet();
  5.                // set.add(new Child());
  6.                 set.add(new Parent(9));
  7.                 set.add(new Parent(4));
  8.                 set.add(new Parent(5));
  9.                 set.add(new Parent(6));
  10.                                 Iterator it = set.iterator();
  11.                                 while(it.hasNext())
  12.                                 {
  13.                                         Parent par = (Parent)it.next();
  14.                                         System.out.println(par.getAge());
  15.                                        
  16.                                 }
  17.         }
  18. }
  19. class Parent implements Comparable {
  20.         private int age;
  21.         Parent(int age){
  22.            this.age = age;
  23.         }
  24.                 public int getAge()
  25.             {
  26.                         return age;
  27.                 }
  28.         public int compareTo(Object o) {
  29.                // System.out.println("method of parent");
  30.                           
  31.                 Parent o1 = (Parent)o;
  32.                                 System.out.println(this.age+"....compareto....."+o1.age);
  33.                
  34.                 if(this.age>o1.age)
  35.                                         return 1;
  36.                                 if(this.age==o1.age)
  37.                                 {
  38.                                         return 0;
  39.                                 }
  40.                                 return -1;
  41.                                 }
  42.                 public String toString()
  43.                 {
  44.                         System.out.println("age:::" + age );
  45.                         return age+"";
  46.                 }
  47.                
  48. }
复制代码

刚才那个排序有点问题,这个么问题了
作者: 午夜b'Boy    时间: 2014-1-6 16:38
建议去看看treeSet集合的特点。treeSet,中元素排序不重复,add一个元素,都会和集合中的元素进行比较。 add方法应该调用了比较器
作者: 随便    时间: 2014-1-6 16:49
本帖最后由 邓宫财 于 2014-1-6 16:50 编辑

给你看看,TreeSet的源码,
需要知道一个数据结构:二叉树。

如果没看懂,感兴趣,再给你详细的分析。

  1. java.util.TreeMap#put(K, V)

  2. public V put(K key, V value) {
  3.         Entry<K,V> t = root;
  4.         if (t == null) {
  5.             // TBD:
  6.             // 5045147: (coll) Adding null to an empty TreeSet should
  7.             // throw NullPointerException
  8.             //
  9.             // compare(key, key); // type check
  10.             root = new Entry<K,V>(key, value, null);
  11.             size = 1;
  12.             modCount++;
  13.             return null;
  14.         }
  15.         int cmp;
  16.         Entry<K,V> parent;
  17.         // split comparator and comparable paths
  18.         Comparator<? super K> cpr = comparator;
  19.         if (cpr != null) {
  20.             do {
  21.                 parent = t;
  22.                 cmp = cpr.compare(key, t.key);
  23.                 if (cmp < 0)
  24.                     t = t.left;
  25.                 else if (cmp > 0)
  26.                     t = t.right;
  27.                 else
  28.                     return t.setValue(value);
  29.             } while (t != null);
  30.         }
  31.         else {
  32.             if (key == null)
  33.                 throw new NullPointerException();
  34.             Comparable<? super K> k = (Comparable<? super K>) key;
  35.             do {
  36.                 parent = t;
  37.                 cmp = k.compareTo(t.key);
  38.                 if (cmp < 0)
  39.                     t = t.left;
  40.                 else if (cmp > 0)
  41.                     t = t.right;
  42.                 else
  43.                     return t.setValue(value);
  44.             } while (t != null);
  45.         }
  46.         Entry<K,V> e = new Entry<K,V>(key, value, parent);
  47.         if (cmp < 0)
  48.             parent.left = e;
  49.         else
  50.             parent.right = e;
  51.         fixAfterInsertion(e);
  52.         size++;
  53.         modCount++;
  54.         return null;
  55.     }
复制代码



作者: L_t    时间: 2014-1-6 20:32
你自己断点调试下看啊




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