一、自动排序功能测试

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;
}
}

运行结果:



当然仅按年龄排序存储的弊端是当名字不同而年龄相同时,靠后者不会存。可以优化代码当年龄相同时判断名字是否相同,这里不再赘述。

感兴趣的朋友还可以试验以下情况:

  1. compareTo方法恒返回0的时候集合中只有一个元素
  2. 恒返回正数的时候集合存取顺序一致
  3. 恒返回负数的时候集合会按存入的倒序存储

JavaSE 集合类TreeSet存储自定义对象的更多相关文章

  1. Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序:Comparable)

    1. TreeSet存储自定义对象并遍历练习2: (1)Student.java package cn.itcast_06; /* * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 * ...

  2. Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序:Comparable)

    1. 自然排序: TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按照升序排列,这种方式就是自然排序. Java中提供了一个Comp ...

  3. 《java入门第一季》之TreeSet存储自定义对象并保证排序和唯一

    上一篇用一个简单的例子,介绍了treeset集合存储的内部过程,这里再完善其存储自定义对象保证唯一. 需求:A:  * 自然排序,按照年龄从小到大排序  *         B:  * 成员变量值都相 ...

  4. JavaSE 集合类HashSet保证自定义对象唯一性

    首先我们自定义Person类,只有姓名和年龄两个属性 class Person{ private String name ; private int age ; public Person(Strin ...

  5. NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

    摘要: NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的 ...

  6. java 16 -11 ArrayList存储自定义对象并增强for遍历

    需求:ArrayList存储自定义对象并遍历.要求加入泛型,并用增强for遍历. A:迭代器 B:普通for     C:增强for LinkedList,Vector,Colleciton,List ...

  7. Java基础知识强化之集合框架笔记41:Set集合之HashSet存储自定义对象并遍历练习

    1. HashSet集合存储自定义对象并遍历.如果对象的成员变量值相同即为同一个对象 注意了: 你使用的是HashSet集合,这个集合的底层是哈希表结构. 而哈希表结构底层依赖:hashCode()和 ...

  8. Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历

    1. HashSet存储自定义对象并遍历 2. 代码示例: (1)Student类,如下: package cn.itcast_02; /** * @author Administrator * */ ...

  9. Java基础知识强化之集合框架笔记24:ArrayList存储自定义对象并遍历

    1. ArrayList存储自定义对象并遍历 2. 代码示例: Student.java,如下: package cn.itcast_01; public class Student { privat ...

随机推荐

  1. 记数据库数据文件损坏恢复ORA-00376+ORA-01110

    现象:业务平台无法登陆,日志报错为ORACLE的错误. 查看oracle日志的报错, ORA-00376: file 5 cannot be read at this time ORA-01110: ...

  2. POIUtils 导出 poi Test 100w 600w 条数据

    依赖: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-l ...

  3. mysql监控执行的sql语句

    转载 https://blog.csdn.net/nzjdsds/article/details/77513869 MySQL用SQL开启general_log并设置路径 2017年08月24日 00 ...

  4. HTTP请求头与响应头(转载)

    欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/400503 ...

  5. thymeleaf标签必须由匹配的结束标记终止

    问题描述 springboot使用Thymeleaf标签时会报元素类型必须由匹配的结果标记终止. 如下所示 如果我们一个个的给这些元素后面加上终止标记也是件很麻烦的事~~~~ 解决办法 方法一: 在p ...

  6. SQL Select 语句小数位数影响计算的准确率的问题

    在财务数据计算中,特别是分摊过程中,0.0001% 和0.00012%看似极小的差异,但是会造成最后求和很大的差异,因此,我们在计算中需要尽可能多的保留占比的小数位数 可以在SELECT CONVER ...

  7. lnmp环境部署脚本-y

    系统环境:centos6.X #!/bin/bash#date:2018-01-01## MySQL 安装8版本的话不太适合,有待于添加安装脚本进行测试#新版的MySQL安装需要高版本2.8以上cma ...

  8. 【译】为什么BERT有3个嵌入层,它们都是如何实现的

    目录 引言 概览 Token Embeddings 作用 实现 Segment Embeddings 作用 实现 Position Embeddings 作用 实现 合成表示 结论 参考文献 本文翻译 ...

  9. jquery中checkbox的选中,反选,全不选 注意1.6版本以上将attr改成prop

    <script type="text/javascript"> $(function () { // 全选 $("#btnCheckAll").bi ...

  10. 其它 搭建https服务器

    原因是这样的,做了个淘宝的数据管理系统(仅供自己使用),然后需要淘宝卖家的生意参谋里面的一些数据,比如实时访客,里面有每个用户搜索什么关键字进来的,这些信息. 自己基于CefSharp开发了一个win ...