java 集合框架-TreeSet

/*
TreeSet可以对Set集合中的对象进行排序;

原理,TreeSet在底层调用了Comparable接口的方法compareTo().
所以,在使用TreeSet存储自定义对象时,要想实现自定义类对象的自然排序,需要类实现Comparable接口,并重写覆盖接口唯一的方法compareTo().

需求:
往TreeSet集合中存储自定义对象学生。
想按照学生的年龄进行排序。

记住:排序时,当主要条件相同时,一定判断一下次要条件。
在本例中,出现了两个同学的年龄是一样的,如果不进行判断次要条件动作,那么会有的学生的信息存储不上,应为在compareTo时返回的是0.
所以,需要继续判断姓名是否一致。在String类中也实现了Comparable接口中的compareTo方法。所以可以直接使用str.compareTo(str1)来实现字符串的比较。

TreeSet的底层数据结构是二叉树的。保存数据唯一性的依据是compareTo方法返回0.

TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
这种方式也称为元素的自然顺序,或者叫做默认顺序。

TreeSet排序的第二种方式:元素本身不具备比较性,那就构造比较器,比较器作为参数传递给TreeSet含参的构造函数。
当两种方式都存在时,以比较器为主。
!!!!!!!!!!!!两种方式的实现在程序TreeSetDemo1.java中!!!!!!!!!!!!!!!!!!
*/

import java.util.*;

class Student implements Comparable//因为TreeSet会对存的对象进行自然排序,其实是它实现了Comparable接口。
{
	private String name;
	private int age;

	Student(String name,int age)
	{
		this.name=name;
		this.age=age;
	}

	public String getName()
	{
		return name;
	}

	public int getAge()
	{
		return age;
	}

	public int compareTo(Object obj)  //重写接口中的方法,实现按年龄进行排序的功能。
	{
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");

		Student s=(Student)obj;
		TreeSetDemo.sop(this.name+"......"+s.name);
		TreeSetDemo.sop(this.name);   //首先是Lily_01进来并存储在TreeSet集合中。然后是Lily_02进来并与Lily_01进行比较。
		if(this.age>s.age)            //底层调用的是compareTo方法。所以在lily_02进来后,this值得就是Lily_02。说白了就是谁进来this就代表谁。
			return 1;         //大的放在二叉树的右边
		if(this.age==s.age)
		{
			return this.name.compareTo(s.name);  //如果说是一样的话,就不会存储相同的对象。
		}
		return -1;  //小的放在二叉树的左边。
	}
}

class TreeSetDemo
{
	public static void main(String[] args)
	{
		TreeSet ts=new TreeSet();
		ts.add(new Student("Lily_01",10));
		ts.add(new Student("Lily_02",9));
		//ts.add(new Student("Lily_03",15));
		//ts.add(new Student("Lily_04",18));
		//ts.add(new Student("Lily_05",5));
		//ts.add(new Student("Lily_06",18));
		//ts.add(new Student("Lily_07",20));

		Iterator it=ts.iterator();
		while(it.hasNext())
		{
			Object obj=it.next();
			Student s=(Student)obj;

			//sop(s.getName()+".."+s.getAge());
		}
		System.out.println("Hello World!");
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}
/*
总结,TreeSet可以对存入的对象进行自然顺序的排序,
是因为其底层数据结构是二叉树,并且实现了Comparable接口的compareTo()方法。
通过自定义对象的类实现Comparable接口,并覆盖compareTo()方法,即可根据自己的需要存储
有顺序的对象数据。
返回1,说明新进元素较大,放在二叉树的右子节点;
返回-1,说明新进元素较小,放在二叉树的左子节点;
返回0,说明对象元素一致,则再比较其他次要条件(比如姓名一样,就比较年龄)

*/
import java.util.*;
class Student implements Comparable
{
	private String name;
	private int age;

	Student(String name,int age)
	{
		this.name=name;
		this.age=age;
	}

	public String getName()
	{
		return name;
	}

	public int getAge()
	{
		return age;
	}

	public int compareTo(Object obj)
	{
		/*按照姓名进行排序,如果姓名一样,那就按照年龄进行排序(升序)*/
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s=(Student)obj;
		int x=this.name.compareTo(s.name);
		if(x==0)
		{
			if(this.age>s.age)
				return 1;
			if(this.age==s.age)
				return 0;
			return -1;
		}
		return x;

		/*
		按照输入的顺序输出:
		return 1;
		*/

		/*
		按照输入的顺序逆序输出:
		return -1;
		*/

		/*
		只存储一个学生的信息:
		return 0;
		*/
	}

}

class TreeSetDemo1
{
	public static void main(String[] args)
	{

		TreeSet ts=new TreeSet();//使用方式一:通过实现Comparable接口并覆盖其中的compareTo()方法.
		TreeSet ts=new TreeSet(new MyCompare()); //使用方式二:使用比较器对年龄进行排序。构造比较器实现Comparator接口,并覆盖compare方法。

		ts.add(new Student("Lily",20));
		ts.add(new Student("Jhon",30));
		ts.add(new Student("Jane",19));
		ts.add(new Student("Sara",17));
		ts.add(new Student("Demetria",25));
		ts.add(new Student("Mike",25));
		ts.add(new Student("Lily",25));

		Iterator it=ts.iterator();
		while(it.hasNext())
		{
			Student s=(Student)it.next();
			sop(s.getName()+","+s.getAge());
		}

		System.out.println("Hello World!");
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

class MyCompare implements Comparator  //定义比较器,实现按照学生年龄进行排序
{
	public int compare(Object obj1,Object obj2)
	{
		if(!(obj1 instanceof Student)||!(obj2 instanceof Student))
			throw new RuntimeException("有对象不是Student类型的。");
		Student s1=(Student)obj1;
		Student s2=(Student)obj2;
		if(s1.getAge()>s2.getAge())
			return 1;
		if(s1.getAge()==s2.getAge())
			return s1.getName().compareTo(s2.getName());
		return -1;
	}
}

时间: 2024-08-01 13:09:29

java 集合框架-TreeSet的相关文章

java 集合框架(TreeSet操作,自动对数据进行排序,重写CompareTo方法)

/*TreeSet * treeSet存入数据后自动调用元素的compareTo(Object obj) 方法,自动对数据进行排序 * 所以输出的数据是经过排序的数据 * 注:compareTo方法返回值有:负数,零,正数.分别表示小于,等于,大于 * 对于存入自定义的对象元素,要重写元素的compareTo(Object obj)方法 * 元素定义时,需要实现Comparable接口 * */ 1 import java.util.Iterator; 2 import java.util.Tr

java 集合框架-TreeSet练习

import java.util.*; /* 练习:按照字符串长度排序. 字符串本身具备比较性,但是它的比较方式不是所需要的.这时就只能使用比较器 注意:在方式二中: int num=new Integer(str1.length()).compareTo(new Integer(str2.length())); 此时num的值有三种可能.正数.负数.零.千万不要写下面的代码: if(num==1) return 1; num不一定等于1.我们在函数中返回的0,1,-1只是代表三种情况:零,正数

Java集合框架总结(3)——TreeSet类的排序问题

Java集合框架总结(3)--TreeSet类的排序问题 TreeSet支持两种排序方法:自然排序和定制排序.TreeSet默认采用自然排序. 1.自然排序 TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序.(比较的前提:两个对象的类型相同). java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该

《深入理解Java集合框架》系列文章

Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framework, JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦.我深深的不解其中的原因.虽然JCF设计参考了STL,但其定位不是Java版的STL,而是要实现一个精简紧凑的容器框架,对STL的介绍自然不能替代对JCF的介绍. 本系列文章主要从数据结构和算法层面分析

JAVA集合框架

收藏 查看我的收藏 146有用+1 56 编辑 Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet.集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实

我所理解Java集合框架的部分的使用(Collection和Map)

所谓集合,就是和数组类似--一组数据.java中提供了一些处理集合数据的类和接口,以供我们使用. 由于数组的长度固定,处理不定数量的数据比较麻烦,于是就有了集合. 以下是java集合框架(短虚线表示接口,长虚线表示抽象类,实线表示类,箭头表示实现接口或者继承)(在网络上找的图,不知道原作者,侵权请联系我删除)(总之,关系很复杂,所以不用记得这个图,只是用来吓吓人而已的). 下面贴上个人理解之精简版之Collection(集)和Map(地图?暂且这么理解吧),话说思维导图蛮好用,以下是两幅思维导图

【Java集合源码剖析】Java集合框架

Java集合工具包位于package java.util下.包含了一些常用的数据结构,如数组.链表(单/双向).树.栈.队列.哈希表等. Java集合框架大致可分为五部分:List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Collections). Java集合类的整体框架如下: 如图,Java集合类大致分为两大类:Collection和Map. Collection主要包括两部分:List和Set. List接口通常表示一个列表(数

java集合框架22

思想:在面向对象的思想里,一种数据结构被认为是一种容器.在本质上来讲是一个类,提供方法支持查找,插入和删除等等操作. Java集合框架支持以下俩种类型的容器: 存储一个元素集合,简称为集合Collection 存储键值对,称为图Map 集合collection 三种主要类型 : 规则集(set) , 线型表(List) , 队列(Queue) set: 存储一组不重复的数据 List: 存储由元素构成的有序集合 Queue: 存储先进先出方式处理的对象 细说Collection接口: 它是处理对

Java集合框架之泛型

广州疯狂软件教育Java培训,iOS培训分享 泛型:1.5版本以后出现的新特性.用于解决安全问题,是一个安全机制. 好处: 1.将运行时期出现问题ClassCaseException,转移到了编译时期. 2.方便与程序员解决问题.让运行时事情减少,安全. 3.避免了强制类型转换 泛型格式:通过<>来定义要操作的引用数据类型 什么时候写泛型: 在集合框架中和常见 只要见到<>就要定义泛型 import java.util.Comparator; import java.util.It