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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fenzheng 中级黑马   /  2014-3-16 17:31  /  916 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

麻烦大家帮我看看问题究竟出在哪里了?

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

代码是这样的

代码是这样的

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

代码是这样的

代码是这样的

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

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

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

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

5 个回复

正序浏览
TreeSet是SortedSet的实现类,是有序的而且无法放入相同的元素,如果自定义对象放入TreeSet,则需要自定义对象实现Comparable接口或者给TreeSet指定Comparator,你是用了实现Comparable的接口实现的就必须自定义排序规则,也就是重写compareTo方法,返回0是代表相等,TreeSet是不允许相等的元素出现的,所以如果你compareTo方法直接返回0则会认为所有的Person对象都是相等的.LZ你是写错地方了,把你的CompareTo方法的内容放到compareTo里面去,一般方法都是小写开头,这是规范

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
1、楼主是想依据年龄对Person对象进行排序把,并把年龄相同视为对象,但结果输出的是lisi02...20。代码本来是没错的,但是把方法名搞错了,现实comparble接口,复写了compareTo方法。
2、对于实现comparble接口的类,TreeSet集合是根据该类的compareTo方法来存储对象的,返回值为零视为两个元素相等,不存。而楼主的compareTo方法一直返回的都是0所以只存储了第一个元素。
3、楼主Person类里面有两个方法,compareTo方法和CompareTo方法,CompareTo方法存放了你比较的代码,把它放到compareTo方法里面,还有CompareTo方法在这个类里面没意义,还有函数名首个单词字母小写是规范,楼主注意一下细节就好了。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
你的Student类中的方法中有两个CompareTo方法。一个是自定义的方法,一个是带有@Override 覆盖(重写)注释的方法,这样默认走的是带注释的那个。。  请去掉其中的一个。 保留一个带有判断的方法。
回复 使用道具 举报
你的最下面的compareTo什么意思?你删掉试试。
回复 使用道具 举报
这个问题之前有人问过,和你的情况一样,就是重写compareTo方法的时候返回值都为0,TreeSet在插入数据时,会调用对象的compareTo方法进行比较,如果为0的话,就不会添加!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马