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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

qjc

中级黑马

  • 黑马币:0

  • 帖子:35

  • 精华:0

© qjc 中级黑马   /  2013-3-21 09:18  /  1120 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 qjc 于 2013-3-21 15:23 编辑

import java.util.*;
class TreeSetDemo
{
        public static void main(String[] args)
        {
                TreeSet ts=new TreeSet();
                ts.add(new Student("lisi02",22));
                ts.add(new Student("lisi007",20));
                ts.add(new Student("lisi09",19));
                ts.add(new Student("lisi08",19));
                Iterator it=ts.iterator();
                while(it.hasNext())
                {
                        Student stu=(Student)it.next();
                        System.out.println(stu.getName()+"..."+stu.getAge());
                }
        }
}
class Student implements Comparable//该接口强制让学生具备比较性。
{
        private String name;
        private int age;
        Student(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        public int compareTo(Object obj)//复写comparable的方法compareTo
        {                        //比什么不知道用obj接收
                return 1;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}
编译后是
lisi02...22
lisi007...20
lisi09...19
lisi08...19
*/
在毕老师15-04的按姓名排序中007<02可以理解
为什么在这个程序中007>02
让人纠结
(这个程序的需求是怎么存进去怎么取出来在15-03)

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

7 个回复

倒序浏览
因为你实现compareable接口重写compareto方法总是返回1,这就此对象永远大于指定对象
然后TreeSet因为底层是二叉树结构,所以第一个元素会放在栈顶,而因为compareto方法重视返回1
所以在存数据的时候,他总是会向二叉树的右边放数据也就是如下结构
第一个元素
       第二个元素
            第三个元素
                第四个元素
因此取得时候也是按照这种顺序来取得

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
  1.   public int compareTo(Object obj)//复写comparable的方法compareTo
  2.         {                        //比什么不知道用obj接收
  3.                 return 1;
  4.         }
复制代码
在这里,你全让它返1,那他就怎么存进去怎么返回了呀,007是<02的
你这个让他怎么存怎么返回,就不是按照Student的自然数序比较了呀
public int compareTo(Object obj)//复写comparable的方法compareTo
        {               
                         Student s=(Student)obj;
      
                 return 1;
        }

正确代码
  1. Student stu=(Student)obj;
  2.       if(!(obj instanceOf Student))
  3.               throw new RuntimeException();.
  4.       this.name.compareTo(stu.getName());
复制代码

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
TreeSet集合添加元素时会调用compareTo方法,如果compareTo方法返回为正数则表明此对象比原来的对象大,
要存在原来对象的后面,你这个程序覆写了comparTo方法,而且总返回1,所以每添加一个对象都会放在原来对象的后面,
所以就会按照你存入的顺序进行排序。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
需要重写一下CompareTo的接口,比如说,按您想的,按照姓名排序
  1.         public int compareTo(Object obj)
  2.         {                        
  3.             Student s = (Student) obj;
  4.             
  5.                 return this.name.compareTo(s.name);
  6.         }
复制代码
回复 使用道具 举报
我手心里的宝 发表于 2013-3-21 09:30
在这里,你全让它返1,那他就怎么存进去怎么返回了呀,007是


嗯,有道理我有明白了,非常感谢
回复 使用道具 举报
qjc 中级黑马 2013-3-21 15:23:30
7#
肖路宽 发表于 2013-3-21 09:26
因为你实现compareable接口重写compareto方法总是返回1,这就此对象永远大于指定对象
然后TreeSet因为底层 ...

非常感谢!!!!!!!!!!!!!
回复 使用道具 举报
qjc 中级黑马 2013-3-21 15:26:20
8#
寇弘禄 发表于 2013-3-21 10:05
TreeSet集合添加元素时会调用compareTo方法,如果compareTo方法返回为正数则表明此对象比原来的对象大,
要 ...

非常精辟,说到了点子上了,豁然开朗啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马