一、自动排序功能测试

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. Vue stage3

    <body> <div id="box1"> <div v-bind:class="{ 'active': isActive, 'error ...

  2. java Thread 类的源码阅读(oracle jdk1.8)

    java线程类的源码分析阅读技巧: 首先阅读thread类重点关注一下几个问题: 1.start() ,启动一个线程是如何实现的? 2.java线程状态机的变化过程以及如何实现的? 3. 1.star ...

  3. 基于C/S 结构的IM即时通讯软件--上篇

    目的:实现类似QQ群聊的聊天室,可以看到好友列表及互相传送信息. 分析:可基于C/S结构实现即时通讯 1.创建基于对话框的MFC程序(支持windows套接字),并增加相应的类与结构体,完善对话框界面 ...

  4. chrome调试vue.js的插件:vue.js devtools

    1.什么是vue.js devtools? vue.js devtools是chrome的一款插件,用来调试vue的一款神器. 2.为什么下载vue.js devtools? 由于vue是数据驱动的, ...

  5. getPageNumRange

    <script> function getPageNumRange(pagenumstr) { var pages=pagenumstr.split(";"); pag ...

  6. celery (二) task

    Task task 具有如下特点: task 可以在任何可调用的地方创建.它有双重角色: 定义了当task被调用时,会发送一个消息. 定义了当worker收到消息时会运行消息对应的函数 每个task都 ...

  7. cpanm Plack相关

    1.curl -L https://cpanmin.us | perl - --sudo App::cpanminus 参考:https://metacpan.org/pod/App::cpanmin ...

  8. (1234队)NABCD分析

    1.N(需求) 我们通过平常上自习时发现的问题和在校调查发现人们在寻找空教室上自习时会遇到诸多问题,其中 问题一:找不到空教室:5% 问题二:非上课教室学生太多:70% 问题三:有占座情况:20% 问 ...

  9. IoU

    IoU #include <cstdio> #include <algorithm> #define re(i,a,b) for(int i=a;i<=b;i++) us ...

  10. less,more,view一个文件时中文可以正常显示,可是VI却显示乱码呢?

    https://blog.csdn.net/konglongaa/article/details/80590470 登陆后输入export LC_ALL="zh_CN.GB2312" ...