四、TreeSet
HashSet 是无序的,如果要对集合实现排序,那么就需要使用TreeSet
让TreeSet 实现集合有序有两种方法
一、让元素自身具备比较排序功能,具备比较排序功能的元素只需要实现Comparable 接口。覆盖接口中CompareTo方法
当 TreeSet中元素是基本数据类型时:
package test;import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo {
/**
* TreeSet中放置基本类型
* @param args
*/
public static void main(String[] args) {
demo1();
}
//创建类TreeSetDemo的静态方法
public static void demo1() {
TreeSet ts = new TreeSet();
ts.add("abc");
ts.add("zaa");
ts.add("aa");
ts.add("nba");
ts.add("cba");
Iterator it = ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
输出结果为:无序,但是这看似无序的集合其中却是有序的,字符串按照字典顺序排序输出。

当 TreeSet中的元素是一个对象时:
package test;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo {
/**
* TreeSet中放置基本类型
* @param args
*/
/*
public static void main(String[] args) {
demo1();
}
//创建类TreeSetDemo的静态方法
public static void demo1() {
TreeSet ts = new TreeSet();
ts.add("abc");
ts.add("zaa");
ts.add("aa");
ts.add("nba");
ts.add("cba");
Iterator it = ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}*/
/**
* TreeSet中放置类
* 此时会报错 ,查看错误原因:java.lang.ClassCastException: test.Person cannot be cast to java.lang.Comparable
* 类装换异常
* @param args
*/
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Person("lisi",21));
ts.add(new Person("zhangsan",28));
ts.add(new Person("zhaoliu",25));
ts.add(new Person("zhouqi",29));
ts.add(new Person("wangu",24));
Iterator it = ts.iterator();
while(it.hasNext()){
Person p = (Person)it.next();
System.out.println(p.getName()+":"+p.getAge());
}
}
}
查看结果:Exception in thread "main" java.lang.ClassCastException: test.Person cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at test.TreeSetDemo.main(TreeSetDemo.java:42)原因:TreeSet中存放的自定义类必须实现comparator接口
//自定义类package test;
public class Person{
private String name;
private int age;
//无参构造
public Person() {
super();
}
//带参构造
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//重写hashCode()方法
@Override
public int hashCode() {
return name.hashCode()+age*27; //将age和name设置成为hashCode。
}
//重写Object的equals() 方法
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(!(obj instanceof Person))
throw new ClassCastException("类型错误");
// System.out.println(this+"....equals....."+obj);
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.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+":"+age;
}
}
让Person类实现Comparable接口,并重写compareTo()方法
package test;
public class Person implements Comparable<Person>{
private String name;
private int age;
//无参构造
public Person() {
super();
}
//带参构造
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//重写hashCode()方法
@Override
public int hashCode() {
return name.hashCode()+age*27; //将age和name设置成为hashCode。
}
//重写Object的equals() 方法
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(!(obj instanceof Person))
throw new ClassCastException("类型错误");
// System.out.println(this+"....equals....."+obj);
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.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+":"+age;
}
//
@Override
public int compareTo(Person p) {
int temp =this.age-p.age;
return temp==0?this.name.compareTo(p.name):temp;
}
}
此时输出结果就是有序的了

二、让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。
四、TreeSet的更多相关文章
- 【java集合框架源码剖析系列】java源码剖析之TreeSet
本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E&g ...
- java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)
说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...
- 对象转型、迭代器Iterator、Set集合、装箱与拆箱、基本数据类型与字符串的转换、TreeSet集合与对象
包的声明与定义 需要注意的是,包的声明只能位于Java源文件的第一行. 在实际程序开发过程中,定义的类都是含有包名的: 如果没有显式地声明package语句,创建的类则处于默认包下: 在实际开发中 ...
- LeetCode第151场周赛(Java)
这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...
- Java——(四)Collection之Set集合TreeSet类
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- TreeSet类 TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗 ...
- [LeetCode] 4Sum 四数之和
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...
- Java入门记(四):容器关系的梳理(上)——Collection
目录 一.Collection及子类/接口容器继承关系 二.List 2.1 ArrayList 2.1.1 序列化的探讨 2.1.2 删除元素 2.1.3 调整大小 2.2 Vector和Stack ...
- JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码
一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInpu ...
- JAVA基础学习day15--集合二 TreeSet和泛型
一.TreeSet 1.1.TreeSet Set:hashSet:数据结构是哈希表.线程是非同步的. 保证元素唯一性的原理:判断元素的HashCode值是否相同. 如果 ...
随机推荐
- SpringMVC源码分析--HandlerMappings
之前分析过SpringMVC中的DispatcherServlet,分析了SpringMVC处理请求的过程.但忽略了一些DispatcherServlet协助请求处理的组件,例如SpringMVC中的 ...
- Python基础之内置函数(二)
先上一张图,python中内置函数: python官方解释在这:点我点我 继续聊内置函数: callable(object):检查对象是否可被调用,或是否可执行,结果为bool值 def f1(): ...
- (十一)会话跟踪技术之作用域(request、session、servletContext)
一.作用域范围 Request 保存的键值仅在下一个request对象中可以得到,作用于两个有请求关系的页面 Session 它是一个会话范围,相当于一个局部变量,从Sess ...
- [opencv] copyTo函数的使用方法
OpenCV中image.copyTo()有两种形式: 1.image.copyTo(imageROI),作用是把image的内容粘贴到imageROI: 2.image.copyTo(imageRO ...
- web前端学习路程
学习路程: 1.HTML和CSS基础 2.JavaScript语言 3.jQuery and ajax 4.综合网站实践 5.优化及调试
- 使用kubeadm部署K8S v1.17.0集群
kubeadm部署K8S集群 安装前的准备 集群机器 172.22.34.34 K8S00 172.22.34.35 K8S01 172.22.34.36 K8S02 注意: 本文档中的 etcd . ...
- [转帖]阿里云VS腾讯云 谁才是中国未来的云计算之王?
阿里云VS腾讯云 谁才是中国未来的云计算之王? https://www.qianzhan.com/analyst/detail/220/191008-f05009f6.html 吴小燕• 2019-1 ...
- python并发编程之协程(实践篇)
一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 对于单线程下,我们不可避免程序中出现io操作,但如果我们 ...
- Image splicing forgery detection combining coarse to refined convolutional neural network and adaptive clustering
粗到精的卷积神经网络与自适应聚类相结合的图像拼接篡改检测 研究方向:图像篡改检测 论文出处:ELSEVIER A类 学校:西安电子科技大学网络工程学院.重庆邮电大学计算机科学与技术学院 关键字:Spl ...
- 位带操作—GPIO输出和输入
GPIOC->ODR |=(0<<2); // 总线操作,即操作整个寄存器. 在51单片机中 P0=0xFE; //总线操作. sbit LED1=P0^0; //位操作,即 ...