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的更多相关文章

  1. 【java集合框架源码剖析系列】java源码剖析之TreeSet

    本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E&g ...

  2. java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)

    说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...

  3. 对象转型、迭代器Iterator、Set集合、装箱与拆箱、基本数据类型与字符串的转换、TreeSet集合与对象

      包的声明与定义 需要注意的是,包的声明只能位于Java源文件的第一行. 在实际程序开发过程中,定义的类都是含有包名的: 如果没有显式地声明package语句,创建的类则处于默认包下: 在实际开发中 ...

  4. LeetCode第151场周赛(Java)

    这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...

  5. Java——(四)Collection之Set集合TreeSet类

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- TreeSet类 TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗 ...

  6. [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 ...

  7. Java入门记(四):容器关系的梳理(上)——Collection

    目录 一.Collection及子类/接口容器继承关系 二.List 2.1 ArrayList 2.1.1 序列化的探讨 2.1.2 删除元素 2.1.3 调整大小 2.2 Vector和Stack ...

  8. JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

    一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInpu ...

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

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

随机推荐

  1. Qt编写自定义控件52-颜色下拉框

    一.前言 这个控件写了很久了,元老级别的控件之一,开发之初主要是自己的好几个项目要用到,比如提供一个颜色下拉框设置对应的曲线或者时间颜色,视频监控项目中经常用到的OSD标签设置,这个控件的难度系数接近 ...

  2. 123457123456---com.threeObj03.FanPaiZi01--- 记忆翻牌儿童

    com.threeObj03.FanPaiZi01--- 记忆翻牌儿童

  3. git 关于Git每次进入都需要输入用户名和密码的问题解决

    解决办法: git bash进入你的项目目录,输入: git config --global credential.helper store 然后你会在你本地生成一个文本,上边记录你的账号和密码.当然 ...

  4. thymeleaf中switch case多出一个空行

    以下是<thymeleaf3.0.5中文参考手册.pdf>中的代码,官方代码没有具体去查询. <div th:switch="${user.role}"> ...

  5. laravel5.2总结

    转自:http://www.cnblogs.com/redirect/p/6178001.html

  6. DB2中的NVL和NVL2函数

    NVL函数是一个空值转换函数 NVL(表达式1,表达式2) 如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值. 该函数的目的是把一个空值(null)转换成一个实际的值.其表达式的值 ...

  7. iOS-类似微信摇一摇

    首先,一直以为摇一摇的功能实现好高大上,结果百度了.我自己也模仿写了一个demo.主要代码如下: 新建一个项目,名字为AnimationShake. 主要代码: - (void)motionBegan ...

  8. SVN安装使用【转】

    SVN使用教程总结   SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Sub ...

  9. 【计算机视觉】Object Proposal之BING理解

    发现: 本论文主要有两大亮点.第一个亮点是发现了在固定窗口的大小下,物体与背景的梯度模式有所不同.如图1所示.图1(a)中绿框代表背景,红框代表物体.如果把这些框都resize成固定大小,比如8X8, ...

  10. CentOS系统安装配置JDK

    我们可以通过xftp工具将jdk文件上传至CentOS系统指定文件夹中 一.安装jdk 进入jdk存放目录,将jdk解压至install文件夹中: tar -zxf jdk-8u151-linux-x ...