TreeSet在Set的元素不重复的基础之上引入排序的概念,其中对自身拥有Comparable的元素,可以直接进行排序,比如字符串,按照字母的自然顺序排序,此处说下对于自定义对象排序的方式。

1、存储元素的类实现Comparable接口

实现Comparable接口,其中只有一个方法

compareTo(Object obj)

obj:是用来比较的对象,也就是前边进入TreeSet的对象

继续以Person来举例,首先实现Person类,代码如下:

class Person implements Comparable
{
private String name;
private int age; public Person(String name, int age)
{
this.name = name;
this.age = age;
}
//特别要注意的是此处也是TreeSet识别重复元素的规则,当年龄一样的时候要判断姓名是否相同,否则若年龄相同的话就不能存入TreeSet
public int compareTo(Object obj)
{
if(!(obj instanceof Person))
throw new RuntimeException("hehe");
Person p = (Person)obj;
int ageGap = this.age - p.age;
if(ageGap > 0)
return 1;
else if(ageGap < 0)
return -1;
else
return this.getName().compareTo(p.getName());
} public void setName(String name)
{
this.name = name;
} public void setAge(int age)
{
this.age = age;
} public String getName()
{
return this.name;
} public int getAge()
{
return this.age;
}
}

2、创建TreeSet时向其中加入Comparator

当元素不具备比较性时,此时只能为容器添加比较器来解决问题,当元素具备比较性,并且容器具备比较器,此时要以比较器为主。

继续以Person作为例子

定义Comparator

//注意Comparator是一个泛型接口
class PersonComparator implements Comparator<Person>
{
public int compare(Person p1, Person p2)
{
int number = p1.getName().compareTo(p2.getName());
//先判断姓名,再判断年龄,和Comparable一样的,只比较一个条件会导致另一个条件不同的元素无法存入TreeSet
if(number == 0)
return new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));
else
return number;
}
}

如何使用

public class Test
{
public static void main(String[] args)
{
//TreeSet的构造方法中有用于接收比较器
TreeSet<Person> ts = new TreeSet<>(new PersonComparator()); ts.add(new Person("zhangsi", 34));
ts.add(new Person("zhangsi", 25));
ts.add(new Person("lisi", 34));
ts.add(new Person("zhangsi", 567));
ts.add(new Person("wangwu", 84));
ts.add(new Person("zhangsi", 23)); Iterator<Person> it = ts.iterator(); while(it.hasNext())
{
Person p = it.next();
System.out.println(p.getName()+"%%%%%"+p.getAge());
}
}
}

TreeSet的特性的更多相关文章

  1. JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习

    JAVA之旅(二十)-HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习 我们继续说一下集合框架 Set:元素是无序(存入和取出的顺序不一定 ...

  2. 普华永道高级JAVA面试记录

    最近在考虑换个工作 原因?咱能不逗吗? 一面感觉发挥不错  二面之后累觉不爱  基本上浪费了半天的工资(好多钱啊~~~) PWD上海地址在浦东软件园  工作环境说实话没我现在工作的环境好,不过里面的人 ...

  3. JAVA学习记录(一)————JAVA中的集合类

    这个图是总体的框架图,主要是两个接口Collection和Map都继承接口Iterator(Iterable),为了实现可以使用迭代器.Collection和Map类似平级关系. 1.这里我先学习下A ...

  4. ht-7 treeSet特性

    TreeSetTreeSet可以对set集合中的元素进行排序,默认按照asic码表的自然顺序排序,之所以treeset能排序是因为底层是二叉树,数据越多越慢,TreeSet是依靠TreeMap来实现的 ...

  5. HashSet HashTable 与 TreeSet

    HashSet<T>类 HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集.并集.差集等.集合中包含一组不重复出现且无特性顺序的元素. HashSet& ...

  6. 集合 LinkedList、ArrayList、Set、Treeset

    LinkedList中特有的方法: 1:方法介绍 addFirst(E e) addLast(E e) getFirst() getLast() removeFirst() removeLast() ...

  7. JAVA基础学习day15--集合二 TreeSet和泛型

    一.TreeSet 1.1.TreeSet Set:hashSet:数据结构是哈希表.线程是非同步的.        保证元素唯一性的原理:判断元素的HashCode值是否相同.         如果 ...

  8. java中treemap和treeset实现(红黑树)

    java中treemap和treeset实现(红黑树)   TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点. TreeSet 和 Tre ...

  9. 微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同。

    微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同. .NET Collection 函数库的 Has ...

随机推荐

  1. 跨域写cookie

    假设a站想往b站写cookie,那么目前有两种方案,参考如下: 第一种(使用jsonp): a站js代码如下: $.ajax({ url: 'http://www.b.com/jsonp.jsp?do ...

  2. HTML5+规范:Webview的使用详解

    一.知识点 Webview模块管理应用窗口界面,实现多窗口的逻辑控制管理操作.通过plus.webview可获取应用界面管理对象. 1.方法 1.1.all: 获取所有Webview窗口 Array[ ...

  3. 《高性能JavaScript》学习笔记(2)——日更中

    我说日更就日更,接着....今天从缓冲布局信息开始啦! -------------------2016-7-22 21:09:12------------------------------- 14. ...

  4. Centos7更改默认启动桌面(或命令行)模式

    centos7以后是这样的,7以前就是别的版本了 1.systemctl get-default命令获取当前模式 2.systemctl set-default graphical.target 修改 ...

  5. 【转】MySQL数据类型

    1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节  范围(-128~127) smallint(m) 2个字节  范围(-32768~32767) mediumint(m) ...

  6. 各大巨头电商提供的IP库API接口-新浪、搜狐、阿里

    新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js     (不可用)新浪多地域测试方法:http://i ...

  7. 什么是HotSpot

    Java 是动态编译,跟C++静态编译不同,这就是JIT编译器的原因(Just In Time) HotSpot会把这些部门动态地编译成机器码,Native code, 并对机器码进行优化, 静态编译 ...

  8. 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...

  9. day06 小数据池和编码

    一. 上次课内容回顾字典:由{}括起来. 每个元素用逗号隔开, key:value的形式存储数据key: 不可变的. 可哈希的.增删改查:1. 增加: 直接用新key来赋值. dict[key] = ...

  10. 【POJ2891】Strange Way to Express Integers(拓展CRT)

    [POJ2891]Strange Way to Express Integers(拓展CRT) 题面 Vjudge 板子题. 题解 拓展\(CRT\)模板题. #include<iostream ...