黑马程序员技术交流社区

标题: 脑袋都想爆了,还没搞懂,谁来帮帮忙? [打印本页]

作者: 来自沙沙的我    时间: 2014-6-23 18:23
标题: 脑袋都想爆了,还没搞懂,谁来帮帮忙?
本帖最后由 来自沙沙的我 于 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;
        }
作者: BigKarel    时间: 2014-6-23 18:57
本帖最后由 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;
}




作者: idency    时间: 2014-6-23 19:01
你的zong定义的是int型的 为什么不直接 返回差值!
return this.zong-obj.zong;
作者: 踏雪风暴    时间: 2014-6-23 20:33
我认为这个代码中的   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;  放在构造函数中
      
作者: yinxjfly    时间: 2014-6-23 20:51
private int zong=yuwen+shuxue+yinyu;
这一句不对,你new Sutdent对象的时候,会有成员变量的显示初始化,int类型的变量都被默认初始化为0,
你定义的int zong=yuwen+shuxue+yinyu;也是0(注意,这时候还没有显示初始化),当默认初始化的时候,
其它三门成绩对应的变量分别被显示初始化了,而zong不会被再次赋值(显示初始化),所以zong 一直为0,调用
compreTo方法,一直未零也就不奇怪了!
你吧zong的赋值放在构造函数内部就OK了!

作者: 来自沙沙的我    时间: 2014-6-23 21:43
BigKarel 发表于 2014-6-23 18:57
错误很明显啊,你又掉用了compareTo()方法。compareTo()比较对象。还有用这个方法试试:
public int co ...

谢谢回复,问题原因找到了,在下面。
作者: 来自沙沙的我    时间: 2014-6-23 21:45
踏雪风暴 发表于 2014-6-23 20:33
我认为这个代码中的   private int zong=yuwen+shuxue+yinyu;  有编写逻辑问题

理由: 这个方法Student    ...

3q。原来如此,谢谢了,给力啊
作者: 来自沙沙的我    时间: 2014-6-23 21:46
yinxjfly 发表于 2014-6-23 20:51
private int zong=yuwen+shuxue+yinyu;
这一句不对,你new Sutdent对象的时候,会有成员变量的显示初始化 ...

恩,小细节没把握住,谢谢




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