黑马程序员技术交流社区

标题: 比较器的小问题 [打印本页]

作者: 张小庆    时间: 2012-4-3 19:35
标题: 比较器的小问题
import java.util.*;
class  Cjd
{
        public static void main(String[] args)
        {
                TreeSet ts = new TreeSet(new MyCompare());
                ts.add(new Student("李雷",18,94));
                ts.add(new Student("韩梅",19,97));
                ts.add(new Student("露西",17,96));
                ts.add(new Student("莉莉",17,94));
                ts.add(new Student("汤姆",18,95));
                Iterator it = ts.iterator();
                while(it.hasNext())
                {
                        Student stu = (Student)it.next();
                        System.out.println("\t"+"姓名:"+stu.getName()+" "+"年龄:"+stu.getAge()+" "+"成绩:"+stu.getResult());
                }
        }
}
class Student //implements Comparable
{
        private String name;
        private int age;
        private int result;
        Student(String name,int age,int result)
        {
                this.name=name;
                this.age=age;
                this.result=result;
        }
        public void setName(String name)
        {
                this.name=name;
        }
        public String getName()
        {
                return name;
        }
        public void setAge(int age)
        {       
                this.age=age;
        }
        public int getAge()
        {
                return age;
        }
        public void setResult(int result)
        {
                this.result=result;
        }
        public int getResult()
        {
                return result;
        }
}
class MyCompare implements Comparator
{
        public int compare(Object o1,Object o2)
        {
                Student s1 =(Student)o1;
                Student s2 =(Student)o2;
                int num = new Integer(s1.getResult()).compareTo(new Integer (s2.getResult()));
                if(num==0)
                        return s1.getName().compareTo(s2.getName());这里如果我改成 return s1.compareTo(s2);就会编译失败,改为  return s1.getAge().compareTo(s2.getAge()); 也是失败。这是为什么啊?                return num;
        }
}
作者: yangshang1    时间: 2012-4-3 20:23
class MyCompare implements Comparator
{
        public int compare(Object o1,Object o2)
        {
                Student s1 =(Student)o1;
                Student s2 =(Student)o2;
                int num = new Integer(s1.getResult()).compareTo(new Integer (s2.getResult()));
                if(num==0)
                        return s1.getName().compareTo(s2.getName());//Integer
                 //改成 因为Integer对象实现了Comparator接口 而s1.getAge()则返回Int基础类型 所以改成就行了Integer.valueOf(s1.getAge()).compareTo(Integer.valueOf(s2.getAge()));
                //这里如果我改成 return s1.compareTo(s2);就会编译失败,改为  return s1.getAge().compareTo(s2.getAge()); 也是失败。这是为什么啊?                return num;
        }
}
作者: 陈超    时间: 2012-4-3 20:32
本帖最后由 陈超 于 2012-4-3 20:34 编辑

          return s1.getName().compareTo(s2.getName());这里如果我改成 return s1.compareTo(s2);就会编译失败,改为  return s1.getAge().compareTo(s2.getAge()); 也是失败。这是为什么啊?   

第一个是因为你的Student类没有实现Comparable接口
第二个是因为s1.getAge()的返回值是int类型的值并不是Integer对象

作者: 张志阳    时间: 2012-4-3 20:35
return s1.getName().compareTo(s2.getName());这句执行的前提是int num = new Integer(s1.getResult()).compareTo(new Integer (s2.getResult()));num==0。compareTo(T o) 是比较此对象与指定对象的顺序。两个对象必须具有可比较的关系。getName()返回值类型为String,它自身具备一种自然排序方式,因此可用compareTo(T o)方法;而如果改成return s1.compareTo(s2);s1,s2不具备比较关系所以编译失败。
作者: 孙天    时间: 2012-4-3 21:18
return s1.compareTo(s2)比较的是两个对象的地址值,要比较需要重新定义一个定义一个tostring()方法,getAge()是int类型返回值,需要用euqals()方法来比较
作者: 孙天    时间: 2012-4-3 21:18
return s1.compareTo(s2)比较的是两个对象的地址值,要比较需要重新定义一个定义一个tostring()方法,getAge()是int类型返回值,需要用euqals()方法来比较
作者: 孙利川    时间: 2012-4-3 21:41
语句return s1.compareTo(s2)会编译失败的根本原因是Student类中没有compareTo方法,它没有实现Comparable接口,自然没有compareTo方法,想要编译通过,可以实现Comparable接口,也可在Student类中只增加compareTo方法。
return s1.getAge().compareTo(s2.getAge())这行语句在语法上是错误的,s1.getAge()应该先封装成对象再调用comareTo方法,如下:
new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));

作者: niceBoy    时间: 2012-4-3 22:14
return s1.getName().compareTo(s2.getName());
因为s1.getName()和s2.getName()返回的是String,而String类中有定义compareTo方法

这里如果我改成 return s1.compareTo(s2);就会编译失败
因为s1和s2是Student对象,而Studnet中并没有compareTo方法

改为  return s1.getAge().compareTo(s2.getAge()); 也是失败。
同理
作者: 张小庆    时间: 2012-4-4 07:18
谢谢大家了,明白了




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