黑马程序员技术交流社区
标题:
比较器的小问题
[打印本页]
作者:
张小庆
时间:
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