`
heipark
  • 浏览: 2078579 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java TreeSet的"陷阱"

    博客分类:
  • Java
 
阅读更多

    TreeSet基于TreeMap,它很有意思,当你执行add()方法的时候,集合会自动排序,不需要手工执行Collections.sort()进行排序,代码更加简洁(Clean),今天使用过程发现它暗藏机关,与大家分享。

 

使用TreeSet有两种方法:

一、元素实现Comparable接口,然后直接通过add方法添加元素即可。

二、创建一个Comparator,并在构造TreeSet的时候传入,如下:

 

 

//我这里Job为待添加元素
Set<Job> jobs = new TreeSet<Job>(new JobComparator());

 

我要实现的需求很简单,根据Job的优先级字段(Priority)进行排序,Job类代码如下:

 

 

public class Job implements Comparable<SortJob> {

	private String jobName;

	private Integer priority;

	public SortJob() {
	}

	public SortJob(String jobName, Integer priority) {
		this.jobName = jobName;
		this.priority = priority;
	}

	public String getJobName() {
		return jobName;
	}

	public void setJobName(String jobName) {
		this.jobName = jobName;
	}

	public Integer getPriority() {
		return priority;
	}

	public void setPriority(Integer priority) {
		this.priority = priority;
	}

	@Override
	public int compareTo(SortJob o) {
		return priority.compareTo(o.getPriority());
	}
}

 

   测试代码如下:

 

 

	@Test
	public void sortJob() {
		Set<SortJob> jobs = new TreeSet<SortJob>();

		jobs.add(new SortJob("001", 1));
		jobs.add(new SortJob("002", 1));
		jobs.add(new SortJob("003", 1));
		assertEquals(3, jobs.size());    // ①

		jobs.clear();
		jobs.add(new SortJob("001", 1));
		jobs.add(new SortJob("002", 3));
		jobs.add(new SortJob("003", 2));

		List<SortJob> listJobs = new ArrayList<SortJob>(jobs);
		assertEquals("001", listJobs.get(0).getJobName());
		assertEquals("003", listJobs.get(1).getJobName());
		assertEquals("002", listJobs.get(2).getJobName());
	}

 

    测试并没有通过,在行①,这里实际集合size为1,出了什么问题呢?

    soga,原来TreeSet的add方法会先调用Job的compareTo方法判断元素是否重复,因为Priority全部为1,所以TreeSet认为后两个Job是重复的,这样的结果显然不是我们想要的,重新实现compareTo方法如下:

 

 

	@Override
	public int compareTo(SortJob o) {
		int compare1 = priority.compareTo(o.getPriority());
		return compare1 == 0 ? this.jobName.compareTo(o.jobName) : compare1;
	}

 

再次运行测试,OK了。

 

总结:

 

  1. TreeSet通过集合元素的compareTo方法判断元素是否重复,实现compareTo方法既要考虑排序,又要考虑对象是否重复
  2. 发现这个陷阱后,发现Collections.sort()还是很不错的选择,只需要考虑排序就可以了。

 

--heipark

 

 

分享到:
评论

相关推荐

    用java的TreeSet写的一个求并集算法

    用JAVA集合TreeSet写的求并集算法

    Java SE程序 TreeSet类中自定义CompareTo类

    Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类...

    javaTreeSet实现图书管理系统

    图书馆管理 1.描述一个图书馆 2.进书,借书卡办理 3.借书,还书 4.查询某书的借出记录 5.查询借书卡的借出记录 6.显示图书列表(按借出次数排序)

    Java TreeSet类的简单理解和使用

    主要介绍了Java TreeSet类的简单理解和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java数据结构--13.Java8数据结构TreeSet.pdf

    Java数据结构--13.Java8数据结构TreeSet 前⾔ ,上⼀篇中对 Set 接⼝最终实现类 HashSet 与 LinkedHashSet 做了介绍与分析,本篇将对另⼀种 Set 接⼝的最终实现类 TreeSet 进⾏ 介绍与分析。 先来看下 TreeSet 完整...

    JavaTreeSet实现摊位销售管理系统

    * 摊位销售管理 1.有一个水果销售摊位,销售3种水果,重量和单价各不相同,实现多次的销售业务 2.销售时如果为顾客为女性销售金额打8折 3.显示当前各种水果的库存数 4.查询全部销售记录信息 5.加入其它水果品种 ...

    JavaTreeSet停车场管理系统

    停车场管理 1.一个停车场,内有多个车位,可停入各种车辆 2.只有具备车牌并高度低于3米的车辆可停入 3.停入时开始计费,按每小时2元 4.查询全部停车位的状态 5.按车牌及停车位号取车,取车时收停车费 ...

    java集合-TreeSet的使用

    TreeSet 是 Java 中的一个集合类,它实现了 SortedSet 接口,并且使用红黑树作为底层数据结构。TreeSet 具有以下主要特点: 排序性:TreeSet 中的元素是有序的,默认按照元素的自然顺序进行排序。或者,可以在创建 ...

    java 集合框架(TreeSet练习)

    毕向东Java基础视频教程-集合框架(TreeSet练习).

    java泛型 用了treeset

    使用TreeSet和Comparator,编写TreeSetTest2类,要求对TreeSet中的元素1-元素10进行排列,排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列。 如果需要的话可以下载,有写成文章的。有写了一点中文...

    Java TreeSet实现学生按年龄大小和姓名排序的方法示例

    主要介绍了Java TreeSet实现学生按年龄大小和姓名排序的方法,涉及java类型转换、遍历、比较等相关操作技巧,需要的朋友可以参考下

    Class003_TreeSet.java

    Class003_TreeSet.java

    java中treemap和treeset实现红黑树

    主要为大家详细介绍了java中treemap和treeset实现红黑树,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    尚硅谷-实验:TreeSet的自然排序与定制排序.pdf

    ·基于JDK 11,将Java8、Java9、Java10、Java11新特性一网打尽 ·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的...

    Java + 集合 + TreeSet +定制排序

    Java是全球排名第一的编程语言,Java工程师也是市场需求最大的软件工程师。 从互联网到企业平台,Java是应用最广泛的编程语言. Java是基于JVM虚拟机的跨平台语言,一次编写,到处运行; Java程序易于编写,而且有...

    TreeSet集合用法

    介绍TreeSet集合用法,向TreeSet集合中添加类的对象,此类需实现Comparable接口,有实例,供需要的朋友下载学习。

    浅谈TreeSet中的两种排序方式

    下面小编就为大家带来一篇浅谈TreeSet中的两种排序方式。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    treeset 和 hashlist 实现的扑克牌游戏

    JAVA集合框架之List、Map、Set之间的选择~小案例分析:http://blog.csdn.net/qq_23473123/article/details/51240739

    HashSet和TreeSet_围墙之外

    HashSet和TreeSet_围墙之外.rar

    计算机后端-Java-Java核心基础-第24章 集合01 25. TreeSet的自然排序.avi

    计算机后端-Java-Java核心基础-第24章 集合01 25. TreeSet的自然排序.avi

Global site tag (gtag.js) - Google Analytics