黑马程序员技术交流社区

标题: TreeSet的问题, [打印本页]

作者: fenzheng    时间: 2014-3-16 17:31
标题: TreeSet的问题,
麻烦大家帮我看看问题究竟出在哪里了?

1.jpg (131.45 KB, 下载次数: 15)

代码是这样的

代码是这样的

2.jpg (68.84 KB, 下载次数: 18)

代码是这样的

代码是这样的

3.jpg (78.46 KB, 下载次数: 19)

为什么运行结果只添加了一个元素进去?

为什么运行结果只添加了一个元素进去?

作者: 张贺    时间: 2014-3-16 17:36
这个问题之前有人问过,和你的情况一样,就是重写compareTo方法的时候返回值都为0,TreeSet在插入数据时,会调用对象的compareTo方法进行比较,如果为0的话,就不会添加!
作者: 李猛    时间: 2014-3-16 17:40
你的最下面的compareTo什么意思?你删掉试试。
作者: 等风来_________    时间: 2014-3-16 18:28
你的Student类中的方法中有两个CompareTo方法。一个是自定义的方法,一个是带有@Override 覆盖(重写)注释的方法,这样默认走的是带注释的那个。。  请去掉其中的一个。 保留一个带有判断的方法。
作者: 牛头人图腾    时间: 2014-3-16 20:23
1、楼主是想依据年龄对Person对象进行排序把,并把年龄相同视为对象,但结果输出的是lisi02...20。代码本来是没错的,但是把方法名搞错了,现实comparble接口,复写了compareTo方法。
2、对于实现comparble接口的类,TreeSet集合是根据该类的compareTo方法来存储对象的,返回值为零视为两个元素相等,不存。而楼主的compareTo方法一直返回的都是0所以只存储了第一个元素。
3、楼主Person类里面有两个方法,compareTo方法和CompareTo方法,CompareTo方法存放了你比较的代码,把它放到compareTo方法里面,还有CompareTo方法在这个类里面没意义,还有函数名首个单词字母小写是规范,楼主注意一下细节就好了。
作者: 乔钰博    时间: 2014-3-16 21:43
TreeSet是SortedSet的实现类,是有序的而且无法放入相同的元素,如果自定义对象放入TreeSet,则需要自定义对象实现Comparable接口或者给TreeSet指定Comparator,你是用了实现Comparable的接口实现的就必须自定义排序规则,也就是重写compareTo方法,返回0是代表相等,TreeSet是不允许相等的元素出现的,所以如果你compareTo方法直接返回0则会认为所有的Person对象都是相等的.LZ你是写错地方了,把你的CompareTo方法的内容放到compareTo里面去,一般方法都是小写开头,这是规范




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2