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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 严学韦 于 2012-8-9 16:07 编辑
  1. import java.util.*;

  2. class Student implements Comparable
  3. {
  4.         private String name;
  5.         private int age;
  6.         Student(String name,int age)
  7.         {
  8.                 this.name=name;
  9.                 this.age=age;
  10.         }
  11.         public int compareTo(Object obj)
  12.         {
  13.                 if(!(obj instanceof Student))
  14.                         throw new RuntimeException("非学生对象");
  15.                 Student s = (Student)obj;
  16.                 if(this.age>s.age)
  17.                         return 1;
  18.                 if(this.age<s.age)
  19.                 {
  20.                         return 0;
  21.                 }
  22.                 return -1;
  23.         }
  24.         public String getName()
  25.         {
  26.                 return name;
  27.         }
  28.         public int getAge()
  29.         {
  30.                 return age;
  31.         }
  32. }

  33. class  TreeSetDemo
  34. {
  35.         public static void main(String[] args)
  36.         {
  37.                 TreeSet ts = new TreeSet();
  38.                 ts.add(new Student("lisi01",22));
  39.                 ts.add(new Student("lisi02",43));
  40.                 ts.add(new Student("lisi03",24));

  41.                 Iterator it = ts.iterator();
  42.                 while(it.hasNext())
  43.                 {
  44.                         Student s = (Student)it.next();
  45.                         System.out.println(s.getName()+".."+s.getAge());
  46.                 }
  47.         }
  48. }
复制代码
ts.add(new Student("lisi03",24)); 这行代码中学生对象不知道有没有添加进去,或者添加进去没有打印出来……


可是我把下面这段代码
if(this.age<s.age)
                {
                        return 0;
                }
改成
if(this.age<s.age)
                {
                        return this.name.compareTo(s.name);
                }  时运行就O了


哪位能用大白话帮我解释下,也可能是我看视频时间长了范2了

Tree.jpg (4.71 KB, 下载次数: 22)

Tree.jpg

Tree2.jpg (6.33 KB, 下载次数: 53)

Tree2.jpg

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 新人鼓励!

查看全部评分

4 个回复

倒序浏览
这个重写的compareTo方法有错误。
public int compareTo(Object obj)

13.        {

14.                if(!(obj instanceof Student))

15.                        throw new RuntimeException("非学生对象");

16.                Student s = (Student)obj;

17.                if(this.age>s.age)

18.                        return 1;

19.                if(this.age<s.age)

20.                {

21.                        return 0;//此处改为return -1,年龄小的排到前面。

22.                }

23.                return -1;//改为return 0,表示年龄相等,是同一个元素。当然也可以再做其他层次的比较

24.        }

至于出现上面方法运行结果的原因:
当添加第三个元素ts.add(new Student("lisi03",24))时,调用比较方法,public int compareTo(Object obj)时,this代表的是"lisi03",24,而传入的参数,即和它比较的是"lisi02",43。此时24<43,返回值是0,程序认定两个元素是重复元素,24就没有存进去。

当你把代码改成了
if(this.age<s.age)

                {

                        return this.name.compareTo(s.name);

                }

是对年龄相等的情况下,名字进行的比较,当然两个元素的名字不同,所以打印出来了24,可名字lisi03比lisi02大,所以排在了后面,结果更是没有按年龄排序。

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 很给力!

查看全部评分

回复 使用道具 举报
周坤 发表于 2012-8-9 16:44
这个重写的compareTo方法有错误。
public int compareTo(Object obj)

谢谢!明白了,我真的犯2了,把比较给忘了
回复 使用道具 举报
请问版主怎么把此贴改为“已解决”?
回复 使用道具 举报
if(this.age<s.age)

                {

                        return 0;

                }
这句话的意思就是说,如果系统拿到一个比致死案年龄小的数据,就回认为和之前那个年龄一样,那就是重复项了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马