黑马程序员技术交流社区
标题:
关于compareTo函数的两个困惑好久的疑问
[打印本页]
作者:
郭孟涛
时间:
2013-2-15 23:45
标题:
关于compareTo函数的两个困惑好久的疑问
本帖最后由 郭孟涛 于 2013-2-15 23:48 编辑
compareTo比较函数,我学习好几天了,还是没有学会,{:soso_e101:}
现在还有两个疑问:
第一个问题:compareTo() 函数在使用的使用是自动执行的吗?我怎么没看到调用语句呢?
他是Comparable类里面构造函数的原因吗?如果是怎么和Comparable的类名不一样呢?
第二个问题:compareTo()函数怎么根据返回的-1或这1的对比值就能做出排序呢?
使用compareTo函数只需要给他返回-1 0 1 这样的三个值,他就可以自动进行排序吗?
困惑好几天了,求指教!!{:soso_e183:} 谢谢
import java.util.*;
class TreeSetDemo2
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new Student("lisi0",30));
ts.add(new Student("lisixx",29));
ts.add(new Student("lisi9",29));
ts.add(new Student("lisi8",38));
ts.add(new Student("lisixx",29));
ts.add(new Student("lisi4",14));
//ts.add(new Student(39));
ts.add(new Student("lisi7",27));
System.out.println(ts); //输出结果为什么是:lisi0::30 ?这个值怎么从构造函数中传到toString函数中了呢?
}
}
//同姓名同年龄的学生视为同一个学生。按照学生的年龄排序。
class Student implements Comparable
{
private int age;
private String name;
Student(String name,int age)
{
this.age = age;
this.name = name;
}
public int compareTo(Object obj)
{
Student stu = (Student)obj;
int num = new Integer(this.age).compareTo(new Integer(stu.age));
return num==0?this.name.compareTo(stu.name):num;
/*
if(this.age>stu.age)
return 1;
if(this.age==stu.age)
return this.name.compareTo(stu.name);
return -1;
*/
/**/
}
//public int getAge()
{
// return age;
}
public String toString()
{
return name+"::"+age;
}
}
复制代码
作者:
黄基焜
时间:
2013-2-16 11:27
本帖最后由 黄基焜 于 2013-2-16 11:29 编辑
问题1:不是自动执行,是集合调用,覆盖compareTo就是让对象自身有比较方法,就好像学校排队一样,老师说按身高从高到低排列,这时学生就一个个自己比较排起队来;
不是构造函数,当你把对象添加到集合时,就会调用
问题2:是-1,0,1这三个数字关系不大,-1代表负数,任意一个负数都可以,1代表的是正数,任意一个正数都可以;0就代表相等
还是比身高例子:在排队时,我跟你比,如果比你高就是返回正数就是1,我站你前面;如果比你矮就返回负数就是-1,我就站你后面;
当我跟你身高相等时,就是返回0,就按照另外一种方式比较,你的代码就是当年龄相等时,就按照名字的自然顺序排。
作者:
陈科宇
时间:
2013-2-16 12:26
朋友,我有回复类似的帖子。compareTo方法是在你存入第二元素时发生作用的。对于TreeSet而言,当你向其中放入第二个对象开始,就会采用compareTo方法与已经包含的元素进行比较。也就是说,当你新放入一个对象时,因为此前的TreeSet已经是有序的。它如果与某个对象比较返回0,则不能存入。很显然,只要你比较规则确定了,那么你新加入的元素就是放在某两个对象之间,会一头一尾。具体的比较算法就是排序。毕老师有专门讲排序,你可以关注一下。
作者:
李大强
时间:
2013-2-16 14:23
你之所以有此疑惑我感觉还是你对TreeSet的特点不了解,下面给你稍微的分析一下你就清楚了
1、TreeSet属于集合,而集合中是不允许有重复元素的,所以在向TreeSet中添加对象时,它必须
保证里面的对象不重复。
2、TreeSet还是一个有序的集合,它里面存放的元素都是有序的(当然不是按照元素存放的顺序排的)。
3、TreeSet集合底层实现的数据结构是二叉排序树,每当你向其中添加元素时它就会拿着当前所添加的对象与树中已经
存在的若干对象进行比较,比较的次数并不确定,直到找到合适的位置为止!
4、当用中序遍历法遍历该二叉排序树时,得到的对象将是已经经过排序的!
5、当向TreeSet集合中添加元素时,集合都会自动的调用对象的compareTo()方法与集合中已经存在的对象进行比较,
比较次数不定,一直找到该对象应该存储的位置为止!
6、对于你所不理解的“compareTo()函数怎么根据返回的-1或这1的对比值就能做出排序呢?”这句话,我的回答是:
此方法要被重复的调用多次,而且在取出元素的时候还要按照特定的算法才可以!
作者:
铿锵科技
时间:
2013-2-16 14:59
TreeSet中的add方法中调用了compareTo方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2