一、自动排序功能测试

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. 微信授权获取用户openId等信息

    在我们开发小程序的时候,需要通过授权获取用户的信息. 第一种使用wx.getUserInfo直接获取微信头像,昵称 // 必须是在用户已经授权的情况下调用 wx.getUserInfo({ succe ...

  2. servlet的运行机制,转发和重定向

    一.当发送一个请求到服务器端的时候,容器(tomcat)会判断该路径属于哪一个servlet进行处理,servlet有一个抽象父类“httpservlet”,这个类是一个模板设计模式的类,其中serv ...

  3. gson格式化参数 对象转Map

    前台传json到后台接收: String  params = request.getParameters("paramtes"); Map<String, Map<St ...

  4. 基于Ubuntu系统XAMPP环境安装以及DVWA渗透测试系统安装(详解的不能再详解了)

    首先这是X勺年人生第二次博,用来记录一下转折于我而言.做个简介,这个Ubuntu是linux的一种吧,然 然后这个Ubuntu是我刚简单安装(在虚拟机上)没有经过任何配置,从头开始,我这绝壁的小白,其 ...

  5. jar 接收utf-8字符乱码现象

    1.今天用php去调用jar出现乱码现象 需要对传递的中文字符进行编码之后再传递这里我用的是urlencode编码,让后java再解码就正常了 这里贴一下代码: <?phpexec(" ...

  6. gitlab中批量删除本地以及远程tag的操作

    git 批量删除标签# 删除所有远程标签git show-ref --tag | awk '{print ":" $2}' | xargs git push origin # 删除 ...

  7. C++ 数组和字符串

    数组和字符串的基本知识 目录 一.数组的声明 二.字符串 一.数组的声明 1.1.存储在每个元素中的值得类型: 1.2.数组名: 1.3.数组中的元素数. ];//short 数组元素值的类型,a数组 ...

  8. ansible自动化

    一,工具与环境介绍   1.1 ansible简介 批量管理服务器的工具 无需部署agent,通过ssh进行管理 流行的自动化运维工具:https://github.com/ansible/ansib ...

  9. com.android.support:design

    Error:Could not find com.android.support:design:27.3.1.Required by: project :app Please install the ...

  10. 卷积神经网络系列之softmax,softmax loss和cross entropy的讲解

    我们知道卷积神经网络(CNN)在图像领域的应用已经非常广泛了,一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等.虽然现在已经开源了很多深度学习框架(比如MxNet,Caf ...