首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java TreeSet的"圈套"

2012-09-14 
Java TreeSet的陷阱? ? TreeSet基于TreeMap,它很有意思,当你执行add()方法的时候,集合会自动排序,不需要

Java TreeSet的"陷阱"

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

?

使用TreeSet有两种方法:

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

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

?

?

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;}@Overridepublic int compareTo(SortJob o) {return priority.compareTo(o.getPriority());}}

?

? ?测试代码如下:

?

?

@Testpublic 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方法如下:

?

?

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

?

再次运行测试,OK了。

?

总结:

?

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

?

--heipark

?

?

热点排行