36、TreeSet详解
TreeSet是SortedSet接口的实现类,TreeSet可以保证元素处于排序状态。与HashSet相比,TreeSet还提供了如下几个而外的方法:
1)、Comparator comparator():如果TreeSet采用了定制排序,则方法返回定制排序所使用的Comparator;如果TreeSet采用的是自然排序,则返回null
2)、Object first():返回集合的第一个元素
3)、Object last():返回集合的最后一个元素
4)、Object lower(Object e):返回集合中位于指定元素之前的元素
5)、Object higher(Object e):返回集合中位于指定元素之后的元素
6)、SortedSet subSet(Object fromElement,Object toElement):返回此Set的子集合,返回从fromElement(包含)到toElement(不包含)
7)、SortedSet headSet(Object toElement):返回此Set的子集,由小于toElement的元素组成
8)、SortedSet tailSet(Object fromElement):返回此Set的子集,由大于或等于fromElement的元素组成
由于TreeSet元素有排序状态,TreeSet会调用集合元素的compareTo方法来比较元素之间的大小,所以这些元素对于的类必须实现Comparable接口。同时在元素调用compareTo方法时,如果两个元素的类型不一致,会出现ClassCastException异常。
总结起来,TreeSet使用要求有:
1、TreeSet中存储的对象必须是同类型的对象
2、TreeSet中存储的类型必须实现了Comparable接口
 public class Test {
     public static void main(String[] args) {
         Student s1=new Student("robin", 20080101);
         Student s2=new Student("ken", 20080114);
         Student s3=new Student("lucy", 20080102);
         Student s4=new Student("jock", 20080103);
         TreeSet<Student> set=new TreeSet<Student>();
         set.add(s1);
         set.add(s2);
         set.add(s3);
         set.add(s4);
         System.out.println(set);
     }
 }
 class Student implements Comparable<Student>{
     private String name;
     private int code;
     public int getCode(){
         return code;
     }
     public Student(String name,int code){
         this.name=name;
         this.code=code;
     }
     @Override
     public int compareTo(Student o) {
         return this.code-o.code;
     }
     @Override
     public String toString() {
         return "Student [name=" + name + ", code=" + code + "]";
     }
 }
结果:[Student [name=robin, code=20080101], Student [name=lucy, code=20080102], Student [name=jock, code=20080103], Student [name=ken, code=20080114]]
如果改变TreeSet中对象的实例变量,这将导致它与其它对象的大小顺序发生变化,但TreeSet不会再次调整他们的顺序,然后会出现其它问题。所以在使用TreeSet和HashSet时,为了程序的更加健壮,推荐不要修改放入HashSet和TreeSet中的元素的关键实例变量。
定制排序
     public static void main(String[] args) {
         Student s1=new Student("robin", 20080101);
         Student s2=new Student("ken", 20080114);
         Student s3=new Student("lucy", 20080102);
         Student s4=new Student("jock", 20080103);
         TreeSet<Student> set=new TreeSet<Student>(new Comparator<Student>() {
             @Override
             public int compare(Student o1, Student o2) {
                 // TODO Auto-generated method stub
                 return o2.getCode()-o1.getCode();
             }
         });
         set.add(s1);
         set.add(s2);
         set.add(s3);
         set.add(s4);
         System.out.println(set);
     }
输出结果:[Student [name=ken, code=20080114], Student [name=jock, code=20080103], Student [name=lucy, code=20080102], Student [name=robin, code=20080101]]
36、TreeSet详解的更多相关文章
- TreeSet()详解
		TreeSet()详解 1.TreeSet原理: /* * TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法 * * Integer能排序(有默认顺序), String能排 ... 
- 【Java入门提高篇】Day31 Java容器类详解(十三)TreeSet详解
		上一篇很水的介绍完了TreeMap,这一篇来看看更水的TreeSet. 本文将从以下几个角度进行展开: 1.TreeSet简介和使用栗子 2.TreeSet源码分析 本篇大约需食用10分钟,各位看官请 ... 
- Jmeter系列(36)- 详解 Loop Controller 循环控制器
		如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 这应该是最简单的控制器了,我们快 ... 
- 重新想象 Windows 8 Store Apps (36) - 通知: Tile 详解
		[源码下载] 重新想象 Windows 8 Store Apps (36) - 通知: Tile 详解 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通知 Tile ... 
- [Spark内核] 第36课:TaskScheduler内幕天机解密:Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详解等
		本課主題 通过 Spark-shell 窥探程序运行时的状况 TaskScheduler 与 SchedulerBackend 之间的关系 FIFO 与 FAIR 两种调度模式彻底解密 Task 数据 ... 
- Java集合详解7:一文搞清楚HashSet,TreeSet与LinkedHashSet的异同
		<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ... 
- 集合框架的详解,List(ArrayList,LinkedList,Vector),Set(HashSet,TreeSet)-(14)
		集合详解: /* Collection |--List:元素是有序的,元素可以重复.因为该集合体系有索引. |--ArrayList:底层的数据结构使用的是数组结构.特点:查询速度很快.但是增删稍慢. ... 
- Java: 集合类详解
		0.参考文献 http://blog.csdn.net/liulin_good/article/details/6213815 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比 ... 
- 【转载】Java 集合详解
		转载:https://www.cnblogs.com/ysocean/p/6555373.html 一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段 ... 
随机推荐
- 五、python的练习题
			1.输入一行字符,分别统计出其中英文字母.空格.数字和其他字符的个数. #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/6/5 ... 
- HDU 5641 King's Phone 模拟
			King's Phone 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5641 Description In a military parade, ... 
- iOS开发系列--视频处理
			MPMoviePlayerController 在iOS中播放视频可以使用MediaPlayer.framework种的MPMoviePlayerController类来完成,它支持本地视频和网络视频 ... 
- MyBatis 错误日志检索
			当怀疑是sql语句执行存在错误时,可以用一下关键字检索日志文件: 检索关键字: Cause: SQLException sql原始报错内容: [DEBUG] [2016-05-03 09:37:05 ... 
- [前端]使用JQuery UI Layout Plug-in布局
			引言 使用JQuery UI Layout Plug-in布局框架实现快速布局,用起来还是挺方便的,稍微研究了一下,就能上手,关于该布局框架的材料,网上也挺多的.在项目中也使用到了,不过那是前端的工作 ... 
- Install Tomcat 7 on CentOS, RHEL, or Fedora
			linux下的 Tomcat 安装: http://www.davidghedini.com/pg/entry/install_tomcat_7_on_centos 
- MySQL year函数
			mysql的日期函数,示例如下: 
- client_thread.c server_thread.c
			client_thread.c #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> ... 
- ssh免密登录方法不生效?Authentication refused: bad ownership or modes for directory
			机器A通过ssh登录机器B,方法有两种: 1.密码方式 2.密钥方式: 两种方式同时开启的时候,优先使用密钥方式. 密钥登录方式的配置方法是,首先在登录机器B上创建文件authorized_keys( ... 
- 数学图形(2.14)Spherical helix曲线
			从http://mathworld.wolfram.com/SphericalHelix.html上找到如下一些关于该曲线的说明,不过似乎他的公式和我的脚本完全是两个东西.. The tangent ... 
