黑马程序员技术交流社区

标题: TreeSet第一种排序方式小结 [打印本页]

作者: itheima_llt    时间: 2015-4-15 16:41
标题: TreeSet第一种排序方式小结
本帖最后由 itheima_llt 于 2015-4-15 17:43 编辑

只根据年龄判断去重,这个太不符合实际了,
把需求改一下:
往TreeSet集合中存储自定义对象学生。
想先按照学生的年龄进行排序,
如果年龄相同则判断姓名,根据字符串排序。
那么只需要在年龄相等的时候在判断一次就可以解决问题了!

运行结果为:


Jone----15
Jordan----16
Jack----20
Jimmy----20
Jane----21
Tom----26
现在符合实际情况了,年龄相同但姓名不同的人已经成功存入了!
而且在年龄相等的情况下,对年龄也进行了自然排序。

现在先做个小结:
在TreeSet集合中去除重复元素的时候,
当主要条件相同时,一定要对次要条件进行判断。
例如,在本例中,主要条件为年龄,次要条件为姓名。

当且仅当主要条件和次要条件均相同的时候,不存入。
例如,在本例中姓名和年龄均相同的时候,不存入。

TreeSet集合的底层数据结构是什么呢?
答案是:二叉树。
那么如果我们想要保持存取顺序一致该怎么做呢??
很简单,只需要在覆盖compareTo方法的时候,令返回值为固定值1,即:
return 1;
这是什么意思呢?
这是表示this对象比obj对象大,对应的二叉树结构就会是这样的:


运行结果:
Jack----20
Jane----21
Jane----21
Jimmy----20
Jone----15
Jone----15
Tom----26
Jordan----16

如果是倒序取出呢?
很简单,只需要在覆盖compareTo方法的时候,令返回值为固定值-1,即:
return -1;
这是表示this对象比obj对象小,对应的二叉树结构就会是这样的:


运行结果:


Jordan----16
Tom----26
Jone----15
Jone----15
Jimmy----20
Jane----21
Jane----21
Jack----20

当return 0;时表示只所有元素都相等,那么就只能存入一个元素了,自然也只能取出一个元素。
运行结果:


Jack----20

所以,再汇总一下所学知识:
TreeSet保证元素唯一性的依据是:
compareTo方法return 0;

TreeSet第一种排序方式:
让元素自身具备可比性,
元素需要实现Comparable接口,覆盖compareTo方法,这种方式叫自然排序!



作者: Grady    时间: 2015-4-15 20:07
回复                  




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