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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张小庆 中级黑马   /  2012-4-3 19:35  /  2208 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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;
        }
}

8 个回复

倒序浏览
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:34 编辑

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

第一个是因为你的Student类没有实现Comparable接口
第二个是因为s1.getAge()的返回值是int类型的值并不是Integer对象
回复 使用道具 举报
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不具备比较关系所以编译失败。
回复 使用道具 举报
return s1.compareTo(s2)比较的是两个对象的地址值,要比较需要重新定义一个定义一个tostring()方法,getAge()是int类型返回值,需要用euqals()方法来比较
回复 使用道具 举报
return s1.compareTo(s2)比较的是两个对象的地址值,要比较需要重新定义一个定义一个tostring()方法,getAge()是int类型返回值,需要用euqals()方法来比较
回复 使用道具 举报
语句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()));
回复 使用道具 举报
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()); 也是失败。
同理
回复 使用道具 举报
谢谢大家了,明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马