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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张杨 黑马帝   /  2011-10-12 17:36  /  6848 人查看  /  8 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1.         public int compareTo(Student s)
  2.         {
  3.                 int num = new Integer(this.sum).compareTo(new Integer(s.sum));
  4.                 if(num==0)
  5.                         return this.name.compareTo(s.name);
  6.                 return num;
  7.         }
复制代码
感觉上边的这个挺饶人的一时转不过来弯,
麻烦解释一下,各个情况下返回的结果。

8 个回复

倒序浏览
API中有定义compareTo
public int compareTo(String anotherString)按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象在参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;compareTo 只有在方法 equals(Object) 返回 true 时才返回 0。

评分

参与人数 1技术分 +2 黑马币 +8 收起 理由
wangfayin + 2 + 8 赞一个!

查看全部评分

回复 使用道具 举报
张杨 黑马帝 2011-10-12 19:42:20
藤椅
我明白了,是不是就是先比较
this 和 s 的num如果相同的话再比较他们的名字的首字母谁在前谁在后,
如果num不相同就返回一个值1或-1,表示this这个对象到时候是排在前边,还是后边,是这样的吗?

评分

参与人数 1技术分 +2 黑马币 +1 收起 理由
admin + 2 + 1

查看全部评分

回复 使用道具 举报
张杨 黑马帝 2011-10-12 19:42:56
板凳
终于50积分啦,庆祝一下:D
回复 使用道具 举报
我去试了试.
结果:姓名: abc,年龄: 20
姓名: aac,年龄: 20
姓名: aaa,年龄: 20
姓名: abc,年龄: 21
姓名: abc,年龄: 80
姓名: abc,年龄: 100
  1. import java.util.Arrays;

  2.   class Student implements Comparable<Student>{
  3.           private String name;
  4.           private int sum;
  5.           
  6.         private Student() {
  7.         }
  8.         private Student(String name, int sum) {
  9.                 this.name = name;
  10.                 this.sum = sum;
  11.         }
  12.         public String getName() {
  13.                 return name;
  14.         }
  15.         public void setName(String name) {
  16.                 this.name = name;
  17.         }
  18.         public int getSum() {
  19.                 return sum;
  20.         }
  21.         public void setSum(int sum) {
  22.                 this.sum = sum;
  23.         }
  24.         public String toString(){
  25.                 return "姓名:"+ this.name+"总分: "+this.sum;
  26.         }
  27.         @Override
  28.         public int compareTo(Student s) {
  29.                   int num = new Integer(this.sum).compareTo(new Integer(s.sum));
  30.           if(num==0)//分数相同
  31.           return this.name.compareTo(s.name);//分数相同比较名字,逐个比较,
  32.           return num;//返回的num可能是0可能是1可能是-1
  33.         }
  34.   }
  35. public class test15 {
  36.         public static void main(String[] args) {
  37.                 Person[] per={new Person("abc", 20),new Person("aac", 20),new Person("aaa", 20),
  38.                                  new Person("abc", 21),new Person("abc", 80),new Person("abc", 100),};
  39.                 Arrays.sort(per);
  40.                 for (int x = 0; x < per.length; x++) {
  41.                         System.out.println(per[x]);
  42.                 }
  43.                 }
  44. }
复制代码
ps:这程序确实是先比较分数,然后比较姓名,但是在比较分数的时候的升序降序控制,还有在分数相同情况下对姓名的升序降序控制,这样覆写compareTo()是无法控制的.或许本身它就不想去控制.所以它才那么写哈
{:soso_e100:}

评分

参与人数 1技术分 +1 黑马币 +4 收起 理由
wangfayin + 1 + 4 赞一个!

查看全部评分

回复 使用道具 举报
重点在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的....】
               
总结:您的例子的原理就是上面的这些知识点。弄明白这些知识点,看这个就易如反掌了。
        给您简写了一下代码:
  1. public int compareTo(Student s)
  2.     {
  3.             int num = new Integer(this.sum).compareTo(new Integer(s.sum));
  4.             return num==0?this.name.compareTo(s.name):num;

  5.     }
复制代码

评分

参与人数 1技术分 +1 黑马币 +4 收起 理由
wangfayin + 1 + 4 赞一个!

查看全部评分

回复 使用道具 举报
chishibo 黑马帝 2011-10-12 21:15:47
7#
伍碧林 发表于 2011-10-12 20:16
我去试了试.
结果:姓名: abc,年龄: 20
姓名: aac,年龄: 20

哦。明白了
回复 使用道具 举报
724681149 黑马帝 2011-10-15 18:00:43
8#
      代码的实现了两个对象的排序,首先是按照Student类中的sum的大小排序,当sum大小相等时,再采用第二排序方法name这个字符串的类的compareTo的比较大小排序。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
你这段代码应该是这样的,
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属性。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马