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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭孟涛 高级黑马   /  2013-2-15 23:45  /  2166 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭孟涛 于 2013-2-15 23:48 编辑

compareTo比较函数,我学习好几天了,还是没有学会,{:soso_e101:}

现在还有两个疑问:

第一个问题:compareTo() 函数在使用的使用是自动执行的吗?我怎么没看到调用语句呢?

他是Comparable类里面构造函数的原因吗?如果是怎么和Comparable的类名不一样呢?


第二个问题:compareTo()函数怎么根据返回的-1或这1的对比值就能做出排序呢?

使用compareTo函数只需要给他返回-1 0 1 这样的三个值,他就可以自动进行排序吗?

困惑好几天了,求指教!!{:soso_e183:} 谢谢
  1. import java.util.*;


  2. class TreeSetDemo2  
  3. {
  4.     public static void main(String[] args)  
  5.     {
  6.         TreeSet ts = new TreeSet();

  7.         ts.add(new Student("lisi0",30));
  8.         ts.add(new Student("lisixx",29));
  9.         ts.add(new Student("lisi9",29));
  10.         ts.add(new Student("lisi8",38));
  11.         ts.add(new Student("lisixx",29));
  12.         ts.add(new Student("lisi4",14));
  13.         //ts.add(new Student(39));
  14.         ts.add(new Student("lisi7",27));


  15.         System.out.println(ts); //输出结果为什么是:lisi0::30 ?这个值怎么从构造函数中传到toString函数中了呢?
  16.     }
  17. }

  18. //同姓名同年龄的学生视为同一个学生。按照学生的年龄排序。
  19. class Student implements Comparable
  20. {
  21.     private int age;
  22.     private String name;
  23.     Student(String name,int age)
  24.     {
  25.         this.age = age;
  26.         this.name = name;
  27.     }

  28.     public int compareTo(Object obj)
  29.     {
  30.         
  31.         Student stu = (Student)obj;
  32.         
  33.         int num = new Integer(this.age).compareTo(new Integer(stu.age));

  34.         return num==0?this.name.compareTo(stu.name):num;

  35.         /*
  36.         if(this.age>stu.age)
  37.             return 1;
  38.         if(this.age==stu.age)
  39.             return this.name.compareTo(stu.name);
  40.         return -1;
  41.         */
  42.         /**/
  43.     }

  44.     //public int getAge()
  45.     {
  46.      //   return age;
  47.     }
  48.     public String toString()
  49.     {
  50.         return name+"::"+age;
  51.     }

  52. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 黄基焜 于 2013-2-16 11:29 编辑

问题1:不是自动执行,是集合调用,覆盖compareTo就是让对象自身有比较方法,就好像学校排队一样,老师说按身高从高到低排列,这时学生就一个个自己比较排起队来;
       不是构造函数,当你把对象添加到集合时,就会调用
问题2:是-1,0,1这三个数字关系不大,-1代表负数,任意一个负数都可以,1代表的是正数,任意一个正数都可以;0就代表相等
       还是比身高例子:在排队时,我跟你比,如果比你高就是返回正数就是1,我站你前面;如果比你矮就返回负数就是-1,我就站你后面;
       当我跟你身高相等时,就是返回0,就按照另外一种方式比较,你的代码就是当年龄相等时,就按照名字的自然顺序排。
回复 使用道具 举报
朋友,我有回复类似的帖子。compareTo方法是在你存入第二元素时发生作用的。对于TreeSet而言,当你向其中放入第二个对象开始,就会采用compareTo方法与已经包含的元素进行比较。也就是说,当你新放入一个对象时,因为此前的TreeSet已经是有序的。它如果与某个对象比较返回0,则不能存入。很显然,只要你比较规则确定了,那么你新加入的元素就是放在某两个对象之间,会一头一尾。具体的比较算法就是排序。毕老师有专门讲排序,你可以关注一下。
回复 使用道具 举报
你之所以有此疑惑我感觉还是你对TreeSet的特点不了解,下面给你稍微的分析一下你就清楚了


1、TreeSet属于集合,而集合中是不允许有重复元素的,所以在向TreeSet中添加对象时,它必须
保证里面的对象不重复。


2、TreeSet还是一个有序的集合,它里面存放的元素都是有序的(当然不是按照元素存放的顺序排的)。


3、TreeSet集合底层实现的数据结构是二叉排序树,每当你向其中添加元素时它就会拿着当前所添加的对象与树中已经
存在的若干对象进行比较,比较的次数并不确定,直到找到合适的位置为止!

4、当用中序遍历法遍历该二叉排序树时,得到的对象将是已经经过排序的!


5、当向TreeSet集合中添加元素时,集合都会自动的调用对象的compareTo()方法与集合中已经存在的对象进行比较,
比较次数不定,一直找到该对象应该存储的位置为止!


6、对于你所不理解的“compareTo()函数怎么根据返回的-1或这1的对比值就能做出排序呢?”这句话,我的回答是:

此方法要被重复的调用多次,而且在取出元素的时候还要按照特定的算法才可以!
回复 使用道具 举报
TreeSet中的add方法中调用了compareTo方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马