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 ...
随机推荐
- LeetCode 104. Maximum Depth of Binary Tree二叉树的最大深度 C++/Java
Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...
- js生成uuid
前端不能像java一样有内置的uuid生成包,所以需要自己写一个function,每次调用这个函数都会生成一个不同的字符串,代码如下: getuuid() { var uid = []; var he ...
- swift-UIPickerView(选择控件)
import UIKit //UIPickerView 的委托协议是 UIPickerViewDelegate,数据源是 UIPickerViewDataSource.我们需要在视图控制器中声明实现 ...
- thinkphp5.1的公共函数库 common.php
首先引入Db类 或者是模型 use think\Db; 然后写公共函数 function getUserName($id){ return Db::table('zh_user')->where ...
- centos mysql 修改mysql用户密码
查看服务器版本: cat /etc/redhat-release 查看mysql 版本: mysql -u root -p use mysql; ###mysql 5.7以上.. update use ...
- C++的正则
C++的正则封装的不丰富.只有最基础的三个主要的函数(也可能是我孤陋寡闻).要有更为丰富的功能需要自己进一步组合. 我目前只需要循环查找这个功能,并且我也不知道c++的正则支持正则的哪些功能; 代码如 ...
- es集群搭建
1.复制5份es,版本要相同,且各个节点上jdk版本也要相同,否则会报数据同步格式不一致 invalid internal transport message format. 2.配置elastic ...
- 安装Python的numpy库
1. 检查是否有pip.exe, 如果没有,可以到 https://pypi.org/project/pip/#files下载 2. 安装好pip后,在安装numpy之前,查看是否安装成功,pip - ...
- [原创] debian 9.3 搭建Jira+Confluence+Bitbucket+crowd+seafile (零) 修改端口的问题
[原创] debian 9.3 搭建Jira+Confluence+Bitbucket+seafile (零) 修改端口的问题 来来来,今天说个没有人说过的事, 搭建好Jira+Confluenc ...
- Day07 - Ruby比一比:Symbol符号与String字串
前情提要: 第六天我们透过Ruby代码练习public,protected和privatemethod时,发现冒号在前面的参数,:mydraft,:myspace,这些就是符号Symbol.在今天,我 ...