JavaSE 集合类TreeSet存储自定义对象
文章目录
一、自动排序功能测试
public class TreeSetDemo {
public static void main(String args[]) {
TreeSet<Integer> myTreeSet = new TreeSet<>();
myTreeSet.add(9) ;
myTreeSet.add(6) ;
myTreeSet.add(8) ;
myTreeSet.add(7) ;
System.out.println(myTreeSet);
}
}
运行结果:

可见TreeSet可以对存入的元素进行自动排序。
二、对自定义类的自动排序
比如我们的自定义类为Person
class Person{
private String name;
private int age ;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "[name=" + name + ", age=" + age + "]";
}
}
放入TreeSet里试试:
public class TreeSetDemo {
public static void main(String args[]) {
TreeSet<Person> myTreeSet = new TreeSet<>();
myTreeSet.add(new Person("唐三",20)) ;
myTreeSet.add(new Person("唐三",20)) ;
myTreeSet.add(new Person("小舞",19)) ;
myTreeSet.add(new Person("奥斯卡",22)) ;
System.out.println(myTreeSet);
}
}
运行就报错了:

因为Person对象间相互无法比较,需要我们定义一个比较的规则,比如按照年龄大小排序。于是我们需要认识到Comparable接口,实现了Comparable的类的对象都可以按照一定规则相互比较。查看下api文档,我们看到熟悉的Integer与String等都实现了Comparable,所以它们间才可以相互比较。

Comparable中只有一个方法:

TreeSet底层是一棵二叉树,小的元素存左边,大的元素存右边,若有了相同元素就不存,在TreeSet集合如何存取元素取决于compareTo方法的返回值,返回负数存左边,返回正数存右边,返回0就不存。(需要注意第一个存的元素不论返回值是什么都会存入二叉树根节点位置,是从第二元素开始遵守以上规律)
我们来看看具体如何实现,修改Person类再次运行TreeSetDemo:
class Person implements Comparable<Person>{
private String name;
private int age ;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "[name=" + name + ", age=" + age + "]";
}
public int compareTo(Person o) {
int num = this.age-o.age;//这里的o是根结点上的Person
return num;
}
}
运行结果:

当然仅按年龄排序存储的弊端是当名字不同而年龄相同时,靠后者不会存。可以优化代码当年龄相同时判断名字是否相同,这里不再赘述。
感兴趣的朋友还可以试验以下情况:
- compareTo方法恒返回0的时候集合中只有一个元素
- 恒返回正数的时候集合存取顺序一致
- 恒返回负数的时候集合会按存入的倒序存储
JavaSE 集合类TreeSet存储自定义对象的更多相关文章
- Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序:Comparable)
1. TreeSet存储自定义对象并遍历练习2: (1)Student.java package cn.itcast_06; /* * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 * ...
- Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序:Comparable)
1. 自然排序: TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按照升序排列,这种方式就是自然排序. Java中提供了一个Comp ...
- 《java入门第一季》之TreeSet存储自定义对象并保证排序和唯一
上一篇用一个简单的例子,介绍了treeset集合存储的内部过程,这里再完善其存储自定义对象保证唯一. 需求:A: * 自然排序,按照年龄从小到大排序 * B: * 成员变量值都相 ...
- JavaSE 集合类HashSet保证自定义对象唯一性
首先我们自定义Person类,只有姓名和年龄两个属性 class Person{ private String name ; private int age ; public Person(Strin ...
- NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
摘要: NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的 ...
- java 16 -11 ArrayList存储自定义对象并增强for遍历
需求:ArrayList存储自定义对象并遍历.要求加入泛型,并用增强for遍历. A:迭代器 B:普通for C:增强for LinkedList,Vector,Colleciton,List ...
- Java基础知识强化之集合框架笔记41:Set集合之HashSet存储自定义对象并遍历练习
1. HashSet集合存储自定义对象并遍历.如果对象的成员变量值相同即为同一个对象 注意了: 你使用的是HashSet集合,这个集合的底层是哈希表结构. 而哈希表结构底层依赖:hashCode()和 ...
- Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历
1. HashSet存储自定义对象并遍历 2. 代码示例: (1)Student类,如下: package cn.itcast_02; /** * @author Administrator * */ ...
- Java基础知识强化之集合框架笔记24:ArrayList存储自定义对象并遍历
1. ArrayList存储自定义对象并遍历 2. 代码示例: Student.java,如下: package cn.itcast_01; public class Student { privat ...
随机推荐
- Spring Boot微服务如何集成fescar解决分布式事务问题?
什么是fescar? 关于fescar的详细介绍,请参阅fescar wiki. 传统的2PC提交协议,会持有一个全局性的锁,所有局部事务预提交成功后一起提交,或有一个局部事务预提交失败后一起回滚,最 ...
- 初次安装Ubuntu后的若干配置步骤
第一步,安装VMware-tools 按照如下提示安装 首先将压缩包,复制到/home 目录下,将其解压,执行./vmware-install.pl即可 第二步,配置使linux能上网 首先将ubun ...
- 11. java中路径/和\的区别
一般可以认为是"/"的作用等同于"\\"在java中路径一般用"/"windows中的路径一般用"\"linux.uni ...
- pflag如何使用
1 为何我对这个库感兴趣呢? 因为我想看看Kubernetes的源码,Kubernetes,Hugo啥的都是那这个解析的命令行参数 2 安装 go get github.com/spf13/pflag ...
- maven repository pom
场景: 如果maven setting.xml 中没指定国内的镜像 可以通过在项目中的pom中指定 指定repository : <properties> <java.version ...
- Spring Security 理解小记
JWT 框架图如下, 来自博客https://blog.csdn.net/shehun1/article/details/45394405 个人觉得还不错.. 在开发中Spring boot 启用 加 ...
- FLV 格式导入 视频
- python setup.py 包含静态文件及模板文件
package_data 和MANIFEST.in都写,include_package_data=True https://stackoverflow.com/a/3597263/8025086
- bashrc和bash_profile
在~/.bashrc中起别名 !/bin/bash下必须加上shopt -s expand_aliases #!/bin/sh下不用 shopt -s expand_aliases 这一条命令让she ...
- CSS 背景图像 background属性简写
background属性简写 background属性可以像margin padding属性一样,有简写方法,它的简写顺序是: background-color background-image ba ...