文档章节

个性集合之TreeSet类的元素有序性排序和元素唯一性的特点

大强森
 大强森
发布于 2017/03/24 22:29
字数 941
阅读 36
收藏 0

 

      TreeSet类是一个具体的类,实现了Set接口,同时Set接口实现Collection接口,三者均带有泛型标志,TreeSet类能够对元素进行有序排序和保证元素不重复存入集合,主要有两条路可以走。

      第一,自然排序法,仅仅使用TreeSet的无参构造方法,同时在元素类中实现Comparable<E>接口,同时,复写该接口的CompareTo(T t)方法。那么,具体的排序规则,我们将可以在该复写方法中自行定义,注意,该方法int   compareTo(T t)带有返回值类型。方法的说明如下:比较此对象与指定对象的顺序。如果该对象小于、等或大于指定对象,则分别返回负整数、零或正整数。

     第二条路,使用带参数构造器,可以说这是集合自带比较器的方法,即TreeSet<E> ts=new TreeSet<E>(Comparator comparator);其中参数(Comparator comparator)是接口类型的参数,形式参数是一个接口类型或者类类型,说明,这里需要的是一个具体实现类对象,所以,这里可以采取匿名对象的形式,并复写接口Comparator的compare(T t1,T t2)方法。那么在该方法体中我们就可以详细写出排序规则。使用匿名对象用完既是垃圾,不占内存。

      两种方法比较,第一种方法比较冗余,不方便,第二种,使用匿名对象,同时复写方法,任何排序规则改动只需在这个地方改即可,比较方便。第一种方法(自然排序法),排序规则的改动需要到元素类中去改动,该排序规则相对于第二种走的路,第一种走的路较多。所以,推荐使用第二种方法。第一种方法,元素类实现相应接口,复写相应方法,方法内定义规则,说白了,就是元素本身具备比较器。第二种方法,说白了,就是集合本身自带比较器。

     TreeSet类的数据结构是红黑二叉树,所以,它能够保证元素的排序和保证元素的不重复,即唯一性。下面给出两种方法的相应代码比较。

        第一种方法,采用自然排序:

/********************************************************************/
import java.util.TreeSet;

//使用TreeSet集合 的自然排序法对元素进行排序
public class TreeSetDemo1 {
	public static void main(String[] args) {
		TreeSet<Student> ts = new TreeSet<Student>();
		ts.add(new Student("曹操", 34));
		ts.add(new Student("刘备", 36));
		ts.add(new Student("关羽", 34));
		ts.add(new Student("张飞", 33));
		ts.add(new Student("司马懿", 37));
		ts.add(new Student("董卓", 39));
		ts.add(new Student("赵子龙", 32));
		for (Student i : ts) {
			System.out.println(i.getName() + " " + i.getAge());
		}
	}
}
/********************************************************************/
/**************************************************************/
public class Student implements Comparable<Student> {
	@Override
	public int compareTo(Student s) {
		int num1 = this.getName().length() - s.getName().length();
		int num2 = num1 == 0 ? this.getName().compareTo(s.getName()) : num1;
		int num3 = num2 == 0 ? this.getAge() - s.getAge() : num2;
		return num3;
	}

	private String name;
	private int 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 Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

}
/**************************************************************/

     第二中,比较器:

import java.util.Comparator;
import java.util.TreeSet;

//使用比较器
public class TreeSetDemo2 {
	public static void main(String[] args) {
		TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
			@Override
			public int compare(Student s1, Student s2) {
				int num1 = s1.getName().length() - s2.getName().length();
				int num2 = num1 == 0 ? s1.getName().compareTo(s2.getName()): num1;
				int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
				return num3;
			}
			});
		ts.add(new Student("曹操", 34));
		ts.add(new Student("刘备", 36));
		ts.add(new Student("关羽", 34));
		ts.add(new Student("张飞", 33));
		ts.add(new Student("司马懿", 37));
		ts.add(new Student("董卓", 39));
		ts.add(new Student("赵子龙", 32));
		for (Student i : ts) {
			System.out.println(i.getName() + " " + i.getAge());
		}
	}
}
public class Student {
	
	private String name;
	private int 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 Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

}

 

© 著作权归作者所有

大强森
粉丝 2
博文 24
码字总数 9681
作品 0
奉贤
程序员
私信 提问
加载中

评论(2)

大强森
大强森

引用来自“Ambitions1”的评论

你所说的TreeSet其实是Collection接口中Set接口的具体实现类,在这里,为什么Set中不能出现重复值呢?你并没有深究。是不是数值相等,就算是两者相等了吗(对于Set来说)?其实,在Set中,就是一个大的容器,不知道你有没有学过数据结构,他不是一个链式结构,而是一种集合,在这个集合中,如果出现了相同的数据,那么会给后面的查询等操作增加难度了。 假如,你的Set中,包含的都是一些JavaBean对象(JSP网站写多了,总喜欢把MVC架构中的数据封装叫做JAVABEAN),当你使用Iterator进行迭代的时候,把第一个JAVABEAN中的某一个属性改为一个重复值,其实这种写法,我再资料上也看过,数据是照样可以修改的,因为Set集合中,会把每一个数据按照两个数据指标来看,首先是equals的数值相等,其次是Set会对每一个加入的对象(不管是引用类型对象还是基本类型对象)都会产生一个HashCode()码,只有当HashCode码和数值相等的时候,Set才会认为这两个数据相等。 感谢你对我一篇博客的指导,我这个人,说不清楚。 谢谢。
好的,也谢谢你的指导,日后我会继续深究你所提出的关于知识点方面的,非常感谢,多多交流学习
Ambitions1
Ambitions1
你所说的TreeSet其实是Collection接口中Set接口的具体实现类,在这里,为什么Set中不能出现重复值呢?你并没有深究。是不是数值相等,就算是两者相等了吗(对于Set来说)?其实,在Set中,就是一个大的容器,不知道你有没有学过数据结构,他不是一个链式结构,而是一种集合,在这个集合中,如果出现了相同的数据,那么会给后面的查询等操作增加难度了。 假如,你的Set中,包含的都是一些JavaBean对象(JSP网站写多了,总喜欢把MVC架构中的数据封装叫做JAVABEAN),当你使用Iterator进行迭代的时候,把第一个JAVABEAN中的某一个属性改为一个重复值,其实这种写法,我再资料上也看过,数据是照样可以修改的,因为Set集合中,会把每一个数据按照两个数据指标来看,首先是equals的数值相等,其次是Set会对每一个加入的对象(不管是引用类型对象还是基本类型对象)都会产生一个HashCode()码,只有当HashCode码和数值相等的时候,Set才会认为这两个数据相等。 感谢你对我一篇博客的指导,我这个人,说不清楚。 谢谢。
Java学习lesson 15

*Set集合 一个包含重复的元素collection,并且最多包含一个null元素,此类实现Set接口,有哈希表支持,Java中的预定义类型如String、Integer都可以在集合内使用;但对于自己创建的类型是,要...

一白菜
2017/11/16
0
0
-1-3 java集合框架基础 java集合体系结构 Collection 常用java集合框架 如何选择集合 迭代器 泛型 通配符概念 Properties 集合 迭代器

集合又称之为容器存储对象的一种方式 •数组虽然也可以存储对象,但长度是固定的;显然需要可变长度的容器 基本框架 Collection |--List |--ArrayList |--Vector |--LinkedList |--Set |--Ha...

noteless
2018/07/03
0
0
Collection —— Set集合

第二部分(Set) Set接口 ———— 继承Collection 1、Set集合(是一个不可有重复元素的Collection) 1)Set集合的特点:是无序的(存储和取出不一致),集合中的元素不可以重复 2)Set子实现类的特...

走了丶
2017/08/05
0
0
Java集合框架之Collection集合

一、引言 Java集合框架和IO框架一样,看似很庞杂的体系框架,但是当你逐一深入每个集合的用法后,就能明显的看出他们之间的区别和联系。最后拎出一个框架图,就一目了然了。由于Java的集合框...

忙碌的键盘
2014/12/09
0
0
Java面试相关---集合

清枫_小天
2016/08/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

windows下cmd常用的命令

windows下常用的命令指示行: windows下 CMD比较常见的命令1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 4. explorer-------打开资源管理器...

WinkJie
29分钟前
1
0
折叠手机适配布局

CSS Grid 设备相关参数 媒体查询 Chrome进行调试,创建相应的模拟机

lilugirl
30分钟前
1
0
Knative Eventing 中如何实现 Registry 事件注册机制

摘要: 在最新的 Knative Eventing 0.6 版本中新增了 Registry 特性, 为什么要增加这个特性, 该特性是如何实现的。针对这些问题,希望通过本篇文章给出答案。 背景 作为事件消费者,之前是...

阿里云云栖社区
33分钟前
0
0
安装 jemalloc for mysql

前言: Jemalloc 是BSD的提供的内存分配管理 安装依赖 $ yum install -y gcc$ yum install autoconf -y 安装 jemalloc $ git clone https://github.com/jemalloc/jemalloc$ cd jema......

Linux_Anna
44分钟前
2
0
linux下ctrl+c中止不了

有一台centos7的服务器,ctrl+c无效,并且tail -f也无效,只能关掉终端或者crtl+z放入后台再删掉,但是ping的时候使用ctrl+c是有效果的。 出现这种情况的原因可能是因为有人要使用ruby安装r...

gaolongquan
57分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部