黑马程序员技术交流社区

标题: 大家帮忙看个代码 [打印本页]

作者: 蒋淑静    时间: 2013-12-8 18:36
标题: 大家帮忙看个代码
本帖最后由 蒋淑静 于 2013-12-8 22:07 编辑
  1. import java.util.*;
  2. class  TreeSetDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 //创建集合对象
  7.                 TreeSet ts=new TreeSet();
  8.                 //将元素存入集合
  9.                 ts.add(new Student("lisi02",22));
  10.                 ts.add(new Student("lisi007",20));
  11.                 ts.add(new Student("lisi09",19));
  12.                 ts.add(new Student("lisi08",19));
  13.                
  14.                 Iterator it=ts.iterator();
  15.                 //遍历集合中的元素,打印对象的属性
  16.                 while(it.hasNext()){
  17.                         Student stu=(Student)it.next();
  18.                         System.out.println(stu.getName()+"::"+stu.getAge());
  19.                 }
  20.         }
  21. }
  22. //自定义类要实现Comparable接口,使其具备比较性
  23. class Student implements Comparable
  24. {
  25.         private String name;
  26.         private int age;
  27.         Student(String name,int age){
  28.                 this.name=name;
  29.                 this.age=age;
  30.         }
  31.         //覆盖compareTo方法,此方法在被自动调用
  32.         public int compareTo(Object obj){
  33.                 if(!(obj instanceof Student)){
  34.                         throw new RuntimeException("不是学生对象");
  35.                 }
  36.                 Student s=(Student)obj;//强转
  37.                 System.out.println(this.name+"..compare.."+s.name);
  38.                 if(this.age>s.age){
  39.                         return 1;
  40.                 }
  41.                 if(this.age==s.age){
  42.                         //当年龄相同时,比较姓名,姓名是字符串,而String类中有比较方法compareTo
  43.                         return 0;//this.name.compareTo(s.name);
  44.                 }
  45.                 return -1;
  46.         }
  47.         public String getName(){
  48.                 return name;
  49.         }
  50.         public int getAge(){
  51.                 return age;
  52.         }
  53. }
复制代码

这程序先比较的是lisi02与lisi02吧,为什么老师运行代码的结果不是先跟自身比较

QQ截图20131208184041.png (2.08 KB, 下载次数: 24)

我的结果

我的结果

QQ截图20131208183939.png (37.93 KB, 下载次数: 16)

老师的

老师的

作者: 依然    时间: 2013-12-8 19:31
用你原本的代码,结果和老师的是一样 的,重新编译再执行试一试?



作者: lichao    时间: 2013-12-8 19:34
你的代码和运行结果是不一致的,你可能看错了,从新看看那个代码对应那个结果。
你的源代码:
  1. import java.util.*;
  2. class  TreeSetDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeSet ts=new TreeSet();
  7.                 ts.add(new Student("lisi02",22));
  8.                 ts.add(new Student("lisi007",20));
  9.                 ts.add(new Student("lisi09",19));
  10.                 ts.add(new Student("lisi08",19));               
  11.                 Iterator it=ts.iterator();
  12.                 while(it.hasNext()){
  13.                         Student stu=(Student)it.next();
  14.                         System.out.println(stu.getName()+"::"+stu.getAge());
  15.                 }
  16.         }
  17. }
  18. class Student implements Comparable
  19. {
  20.         private String name;
  21.         private int age;
  22.         Student(String name,int age){
  23.                 this.name=name;
  24.                 this.age=age;
  25.         }
  26.         public int compareTo(Object obj){
  27.                 if(!(obj instanceof Student)){
  28.                         throw new RuntimeException("不是学生对象");
  29.                 }
  30.                 Student s=(Student)obj;
  31.                 System.out.println(this.name+"..compare.."+s.name);
  32.                 if(this.age>s.age){
  33.                         return 1;
  34.                 }
  35.                 if(this.age==s.age){/在这你你没有写name的比较,那么他是按age比较的那么俩个19只能有一个,你的结果里有俩是不可能的。
  36.                         return 0;//这里改为return this.name.compareTo(s.name);才能在比较name
  37.                 }
  38.                 return -1;
  39.         }
  40.         public String getName(){
  41.                 return name;
  42.         }
  43.         public int getAge(){
  44.                 return age;
  45.         }
  46. }
复制代码

运行结果:
lisi007..compare..lisi02
lisi09..compare..lisi02
lisi09..compare..lisi007
lisi08..compare..lisi007
lisi08..compare..lisi09
lisi09::19
lisi007::20
lisi02::22
作者: 蒋淑静    时间: 2013-12-8 20:39
依然 发表于 2013-12-8 19:31
用你原本的代码,结果和老师的是一样 的,重新编译再执行试一试?

我的还是不一样啊,你是说我的代码是对的吗
作者: 蒋淑静    时间: 2013-12-8 20:40
lichao 发表于 2013-12-8 19:34
你的代码和运行结果是不一致的,你可能看错了,从新看看那个代码对应那个结果。
你的源代码:

你这个运行的使我的源代码吗?我一运行就不是这样啊
作者: 蒋淑静    时间: 2013-12-8 20:52
lichao 发表于 2013-12-8 19:34
你的代码和运行结果是不一致的,你可能看错了,从新看看那个代码对应那个结果。
你的源代码:

我改了也是不样的啊,还有就是这里面的this.name和s.name每次都代表是哪个啊,我怎么看着有些乱啊
作者: 王东旭    时间: 2013-12-8 21:02
版本问题
作者: lichao    时间: 2013-12-8 21:08
那可能是你JDk的问题了,我就用你发的代码运行的,this代表的调用该方法的对象,s代表的参数对象
作者: 蒋淑静    时间: 2013-12-8 21:29
lichao 发表于 2013-12-8 21:08
那可能是你JDk的问题了,我就用你发的代码运行的,this代表的调用该方法的对象,s代表的参数对象 ...

嗯,那应该是吧,我是1.7的,
那个第一次传进去的是lisi02 第二此是007,这个时候007是this?s是02?
作者: lichao    时间: 2013-12-8 21:42
恩,是的,如果实在分不清可以这样
  1. import java.util.*;
  2. class  TreeSetDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeSet ts=new TreeSet();
  7.                 ts.add(new Student("lisi02",22));
  8.                 ts.add(new Student("lisi007",20));
  9.                 ts.add(new Student("lisi09",19));
  10.                 ts.add(new Student("lisi08",19));
  11.                
  12.                 Iterator it=ts.iterator();
  13.                 while(it.hasNext()){
  14.                         Student stu=(Student)it.next();
  15.                         System.out.println(stu.getName()+"::"+stu.getAge());
  16.                 }
  17.         }
  18. }
  19. class Student implements Comparable
  20. {
  21.         private String name;
  22.         private int age;
  23.         private static int flag=1;//新添加的
  24.         Student(String name,int age){
  25.                 this.name=name;
  26.                 this.age=age;
  27.         }
  28.         public int compareTo(Object obj){
  29.                 if(!(obj instanceof Student)){
  30.                         throw new RuntimeException("不是学生对象");
  31.                 }
  32.                 Student s=(Student)obj;
  33.                 System.out.println("第"+(flag++)+"次:"+"this."+this.name+"..compare.."+"s."+s.name);//新添加的
  34.                 if(this.age>s.age){
  35.                         return 1;
  36.                 }
  37.                 if(this.age==s.age){
  38.                        return 0;
  39.                 }
  40.                 return -1;
  41.         }
  42.         public String getName(){
  43.                 return name;
  44.         }
  45.         public int getAge(){
  46.                 return age;
  47.         }
  48. }
复制代码

结果:
第1次:this.lisi007..compare..s.lisi02
第2次:this.lisi09..compare..s.lisi02
第3次:this.lisi09..compare..s.lisi007
第4次:this.lisi08..compare..s.lisi007
第5次:this.lisi08..compare..s.lisi09
lisi09::19
lisi007::20
lisi02::22
作者: 蒋淑静    时间: 2013-12-8 21:56
lichao 发表于 2013-12-8 21:42
恩,是的,如果实在分不清可以这样

结果:

嗯,知道了,谢了




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