黑马程序员技术交流社区
标题:
Student类重写compareTo()方法
[打印本页]
作者:
张杨
时间:
2011-10-12 17:36
标题:
Student类重写compareTo()方法
public int compareTo(Student s)
{
int num = new Integer(this.sum).compareTo(new Integer(s.sum));
if(num==0)
return this.name.compareTo(s.name);
return num;
}
复制代码
感觉上边的这个挺饶人的一时转不过来弯,
麻烦解释一下,各个情况下返回的结果。
作者:
庞金梁
时间:
2011-10-12 17:48
API中有定义compareTo
public int compareTo(String anotherString)按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象在参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;compareTo 只有在方法 equals(Object) 返回 true 时才返回 0。
作者:
张杨
时间:
2011-10-12 19:42
我明白了,是不是就是先比较
this 和 s 的num如果相同的话再比较他们的名字的首字母谁在前谁在后,
如果num不相同就返回一个值1或-1,表示this这个对象到时候是排在前边,还是后边,是这样的吗?
作者:
张杨
时间:
2011-10-12 19:42
终于50积分啦,庆祝一下:D
作者:
伍碧林
时间:
2011-10-12 20:16
我去试了试.
结果:姓名: abc,年龄: 20
姓名: aac,年龄: 20
姓名: aaa,年龄: 20
姓名: abc,年龄: 21
姓名: abc,年龄: 80
姓名: abc,年龄: 100
import java.util.Arrays;
class Student implements Comparable<Student>{
private String name;
private int sum;
private Student() {
}
private Student(String name, int sum) {
this.name = name;
this.sum = sum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
public String toString(){
return "姓名:"+ this.name+"总分: "+this.sum;
}
@Override
public int compareTo(Student s) {
int num = new Integer(this.sum).compareTo(new Integer(s.sum));
if(num==0)//分数相同
return this.name.compareTo(s.name);//分数相同比较名字,逐个比较,
return num;//返回的num可能是0可能是1可能是-1
}
}
public class test15 {
public static void main(String[] args) {
Person[] per={new Person("abc", 20),new Person("aac", 20),new Person("aaa", 20),
new Person("abc", 21),new Person("abc", 80),new Person("abc", 100),};
Arrays.sort(per);
for (int x = 0; x < per.length; x++) {
System.out.println(per[x]);
}
}
}
复制代码
ps:这程序确实是先比较分数,然后比较姓名,但是在比较分数的时候的升序降序控制,还有在分数相同情况下对姓名的升序降序控制,这样覆写compareTo()是无法控制的.或许本身它就不想去控制.所以它才那么写哈
{:soso_e100:}
作者:
苏志伟
时间:
2011-10-12 20:35
重点在Comparable接口!
1.要使一个实例化对象具有可比较性,那么这个实例化对象所对应的类,就必须实现Comparable接口!
2.String,和int的包装类Interger都实现了Comparable这个接口!所以他们都具有可比较性。
3.哥哥对象都实现了Comparable接口中的compareTo方法。注意这个方法的返回值值的特点。
----------负整数、零或正整数,根据此对象是小于、等于还是大于指定对象
重点的来了注意:Intege类的compareTo明显的是比较数字的大小!
-----------如果该 Integer 等于 Integer 参数,则返回 0 值;如果该 Integer 在数字上小于 Integer 参数,则返回小于 0 的值;如果 Integer 在数字上大于 Integer 参数,则返回大于 0 的值(有符号的比较)。
String类的compareTo则是按照这两个字符的字符顺序排列的!
------------如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。【注意:什么是字典顺序:通俗的例子:"a,b,c"这3个字符中 a的字典顺序小于b的字典顺序,b的字典顺序小于c的....】
总结:您的例子的原理就是上面的这些知识点。弄明白这些知识点,看这个就易如反掌了。
给您简写了一下代码:
public int compareTo(Student s)
{
int num = new Integer(this.sum).compareTo(new Integer(s.sum));
return num==0?this.name.compareTo(s.name):num;
}
复制代码
作者:
chishibo
时间:
2011-10-12 21:15
伍碧林 发表于 2011-10-12 20:16
我去试了试.
结果:姓名: abc,年龄: 20
姓名: aac,年龄: 20
哦。明白了
作者:
724681149
时间:
2011-10-15 18:00
代码的实现了两个对象的排序,首先是按照Student类中的sum的大小排序,当sum大小相等时,再采用第二排序方法name这个字符串的类的compareTo的比较大小排序。
作者:
白磊
时间:
2013-5-5 18:36
你这段代码应该是这样的,
int num = new Integer(this.sum).compareTo(new Integer(s.sum));
上面这句是先将两个对象的sum属性进行比较,等于的时候返回值为0;小鱼的时候返回-1,;大雨的时候返回1.并将返回值赋给num。
if(num==0)
return this.name.compareTo(s.name);
return num;
所以它的比较策略是这样的:
先用sum属性进行比较,1.当sum!=0时,就直接返回num值,也就是说只要sum属性值不相等,就只需要用这个来比较就行了。
2. 当num=0时,也就是当sum相等的时候,再去比较他们的name属性。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2