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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 来自沙沙的我 于 2014-6-24 13:01 编辑

class Student implements Comparable<Student>//一个学生类的comparable比较方法的问题,这个类简写过了
{
        private int yuwen;
        private int shuxue;
        private int yinyu;
        private String name;
        private int zong=yuwen+shuxue+yinyu;
        Student(String name,int yuwen,int shuxue,int yinyu)
        {
                this.name=name;
                this.yuwen=yuwen;
                this.shuxue=shuxue;
                this.yinyu=yinyu;
               
        }
public int compareTo(Student obj)
        {
                int i=new Integer(this.zong).compareTo(new Integer(obj.zong));
                //if(i==0)                                                       开始一直排序错误,后来把这个注解掉发现不论总成绩如何,i都为0,无语,不是自然排序吗?是将这个Student对象装到了TreeSet集合里面去的,比较一直不成功,我记得毕老师说过这个,但是我有点没弄明白,哪位能详细说说,麻烦了。
               
                        //return this.name.compareTo(obj.getName());
               
                return i;
        }

7 个回复

倒序浏览
本帖最后由 BigKarel 于 2014-6-23 19:31 编辑

错误很明显啊,你又掉用了compareTo()方法。compareTo()比较对象。还有用这个方法试试:
public int compareTo(Student obj){
        if(!(obj instanceof Student)){
                throw new RuntimeException("不是学生对象");
        }
        Student s = (Student)o;
        if(this.zong > s.zong){
                return 1;
        }
        if(this.zong==s.zong){
                return this.name.compareTo(s.name);
        }
        return -1;
}



评分

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

查看全部评分

回复 使用道具 举报
你的zong定义的是int型的 为什么不直接 返回差值!
return this.zong-obj.zong;
回复 使用道具 举报
我认为这个代码中的   private int zong=yuwen+shuxue+yinyu;  有编写逻辑问题

理由: 这个方法Student   ,当第一次调用时,通过构造函数,有了name, yuwen, shuxue, yinyu 值
但zong  的值没有算出来,也就是说我认为你调用的Student 方法,zong一直没有运算,原因在于在构造函数之外了。
所以 int i=new Integer(this.zong).compareTo(new Integer(obj.zong));这句话中
this.zong 和  obj.zong 都为0,所以无法自然排序

解决方法:
zong=yuwen+shuxue+yinyu;  放在构造函数中
      
回复 使用道具 举报
private int zong=yuwen+shuxue+yinyu;
这一句不对,你new Sutdent对象的时候,会有成员变量的显示初始化,int类型的变量都被默认初始化为0,
你定义的int zong=yuwen+shuxue+yinyu;也是0(注意,这时候还没有显示初始化),当默认初始化的时候,
其它三门成绩对应的变量分别被显示初始化了,而zong不会被再次赋值(显示初始化),所以zong 一直为0,调用
compreTo方法,一直未零也就不奇怪了!
你吧zong的赋值放在构造函数内部就OK了!
回复 使用道具 举报
BigKarel 发表于 2014-6-23 18:57
错误很明显啊,你又掉用了compareTo()方法。compareTo()比较对象。还有用这个方法试试:
public int co ...

谢谢回复,问题原因找到了,在下面。
回复 使用道具 举报
踏雪风暴 发表于 2014-6-23 20:33
我认为这个代码中的   private int zong=yuwen+shuxue+yinyu;  有编写逻辑问题

理由: 这个方法Student    ...

3q。原来如此,谢谢了,给力啊
回复 使用道具 举报
yinxjfly 发表于 2014-6-23 20:51
private int zong=yuwen+shuxue+yinyu;
这一句不对,你new Sutdent对象的时候,会有成员变量的显示初始化 ...

恩,小细节没把握住,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马