【0】README

0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java集合——树集(TreeSet)+对象的比较 的相关知识;
0.2) for full source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/chapter13/TreeSetTest.java
0.3) for java.lang.Comparable 和 java.util.Comparator 的区别和联系:
http://blog.csdn.net/pacosonswjtu/article/details/50320775 + http://blog.csdn.net/pacosonswjtu/article/details/50320887


【1】树集(TreeSet)(用到了红黑树)

1.1)树集是一个有序集合。可以以任意顺序将元素插入到集合中, 在对集合进行遍历时,每个值将自动地按照排序后的顺序呈现;

  • 1.1.1)看个荔枝:
SortedSet<String> sorter = new TreeSet<>(); // TreeSet implements SortedSet
sorter.add("bob");
sorter.add("car");
sorter.add("amy");
for(String s: sorter)System.println(s);

1.1.2)将元素添加到 树(TreeSet)中要比添加到散列表(HashSet)中慢, 但是,与将元素添加到数组或链表的正确位置上相比还是快很多的;


Attention) TreeSet 的排序功能用到了红黑树, 因此迭代器总是以排好序的顺序访问每个元素)

API java.util.TreeSet<E> 1.2
TreeSet():构造一个空树集;
TreeSet(Collection<? extends E> elements):构造一个树集, 并将集合中所有元素添加到树集中;

【2】对象的比较

2.1) TreeSet如何知道希望元素怎样排列呢? 在默认情况下, 树集假定插入的元素实现了 Comparable 接口, 这个接口定义了一个方法:

public interface Comparable<T>
{in compareTo(T other);
}
  • 2.1.1)排序后,a在b的前面,后面或相等,分别返回 负值,正值,0;
  • 2.1.2)有些标准的 java 平台类实现了 Comparable接口,如, String类, 这个类的compareTo() 方法依据字典顺序对字符串进行比较;

2.2)如果要插入自定义对象, 就必须通过实现 Comparable接口自定义排列顺序。

  • Attention)在 Object类中, 没有提供任何 compareTo 接口的默认实现 (干货);
  • 2.2.1)看个荔枝:(展示了如何用部件编号对 Item 对象进行排序)
class Item implements Comparable<Item>
{public int compareTo(Item other){return partNumber - other.partNumber;}
}
  • Warning)只有整数在一个足够小的范围内,才可以使用这个技巧。 如果x是一个较大的正整数, y是一个较大的负整数, x-y 有可能会溢出;

2.3)出现的问题+解决方法

  • 2.3.1)出现的问题:使用 Comparable接口定义排列排序显然有其局限性。对于一个给定的类, 只能实现这个接口一次。如果在一个集合中需要按照部件编号进行排序, 在另一个集合中 却要按照描述信息进行排序, 该怎么办呢?还有,如果需要对一个类的对象进行排序, 而这个类的创建者又没有实现 Comparable接口, 又该怎么办呢?
  • 2.3.2)解决方法: 通过将 Comparator 对象传递给TreeSet构造器来告诉树集使用不同的比较方法。 Comparator接口声明了一个带有两个显式参数的compare 方法:
public interface Comparator<T>
{int compare(T a, T b);
}
  • (即, 当两个不同集合中的元素的排序规则不同, 就要引入Comparator)
  • 2.3.2.1)与 compareTo() 方法一样,a在b之前,之后,或相等, 分别返回 正值, 负值和零;所以,我们直接定义一个 实现 Comparator 接口的类:
class ItemComparator implements Comparator<Item>
{public int compare(Item a, Item b){String desrcA = a.getDescription();String desrcB = b.getDescription();String desrcA.compareTo(desrcB);}
}
  • 2.3.2.2)然后将这个类对象传递给树集的构造器:
ItemComparator comp =  new ItemComparator();
SortedSort<Item> sort = new TreeSet<>(comp);
  • Attention)

    • A1) 注意, 这个比较器没有任何数据, 它只是比较方法的持有器。有时将这种对象称为函数对象。
    • A2)函数对象通常动态定义, 即定义为匿名内部类的实例:
SortedSet<Item> set = new TreeSet<>(new Comparable<Item>(){    //匿名 内部类;public int compare(Item a, Item b) // 匿名内部类中的方法;{String desrcA = a.getDescription();String desrcB = b.getDescription();String desrcA.compareTo(desrcB);}
});

Annotation)

  • A1)实际上, Comparator 接口声明了两个方法:compare 和 equals;
  • A2)当然,每个类都有一个 equals 方法, 因此, 为这个接口声明再添加一个 equals 方法似乎没有太大的好处;
  • A3) API文档说, 不需要覆盖equals 方法, 但这样做可能会在某些情况下 提高性能;

2.4)下面的图是否给了我们的疑虑:是否总应该用 树集(TreeSet)取代散列集(HashSet)?

  • 2.4.1)因为添加一个元素所花费的时间看上去并不很长, 而且元素时自动排序的;
  • 2.4.2)到底应该怎样做将取决于 所要收集的数据。如果不需要对数据进行排序,就没有必要付出排序开销 (干货,如何选择集类型, 是树集TreeSet 还是 散列集 HashSet)。
  • 2.4.3)更重要的是, 对其排序要比 散列函数更加困难, 因为散列函数只是将对象适

2.5)收集矩形集(just for coarse understanding):想具体了解树集和散列集间的差异, 还需要研究一个收集矩形集的任务。如果使用 TreeSet, 就需要提供 Comparator;

  • 2.5.1)如何比较两个矩形呢? 比较面积吗。这行不通。可能会有两个不同的矩形, 它们的坐标不同, 但面积却相同。 树的排序必须是全序的。也就是说, 任意两个元素是可比的,并且只有在两个元素相等时才return 0;
  • 2.5.2)确实, 有一种矩形的排序方式, (按照坐标的字典顺序排序), 但它的计算很牵强且很繁琐。 相反地, Rectangle 类已经定义了散列函数, 它直接对坐标进行散列;

Annotation) 从 Java SE 6 开始, TreeSet 类实现了 NavigableSet 接口。 这个接口增加了几个便于定位元素以及反向遍历的方法;

2.6)看个荔枝:(下面的程序创建了两个 Item 对象的树集, 第一个按照部件编号排序, 这是Item对象的默认顺序。第二个通过使用一个定制的比较器来按照描述信息排序-)


Complementary)我们给出 Integer 源码 的 Comparatable 实现:


java.lang.Comparable<T> 1.2
int compareTo(T other) :将this 和 other 进行比较, 返回 正值、负值和0;java.util.Comparator<T> 1.2
int compare(T a, T b): 将a 和 b进行比较, 返回 正值、负值和0;java.util.SortedSet<T> 1.2
Comparator<? super E> comparator() :返回用于对元素进行排序的比较器, 如果元素用 Comparable 接口的compareTo 方法比较则返回 null;
E first();
E last();
返回有序集中的最小最大元素;java.util.NavigableSet<E> 6
E higher(E value)
E lower(E value)
返回大于 value 的最小元素或小于 value 的最大元素,否则返回 null;E ceiling(E value)
E floor(E value)
返回大于等于 value 的最小元素或小于等于 value 的最大元素,否则返回 null;E pollFirst(E value)
E pollLast(E value)
删除并返回这个集中的最大元素或最小元素, 这个集为空时返回 null;Iterator<E> descendingIterator():返回一个按照 递减顺序遍历集合中元素的迭代器;java.util.TreeSet<E> 1.2
TreeSet() :构造一个用于 排列 Comparable 对象的树集;
TreeSet(Comparator<? super E > c ):构造一个树集, 并使用指定的比较器对其中的元素进行排序;
TreeSet(SortedSet<? extends E> elements):构造一个树集, 将有序集中的所有元素添加到这个树集中, 并使用与给定集合相同的元素比较器;

java集合——树集(TreeSet)+对象的比较相关推荐

  1. java集合对字符串或对象去重

    由于开发中遇到了集合中筛选重复字符串或对象的操作,下面记录几种常用的方法,以备后续查询使用,直接上代码, /*** list去掉重复元素* * @param datas* @return*/publi ...

  2. java集合 测试对TreeSet的使用

    1.定义一个Employee类.. 该类包含: private 成员变量name,age,birthday, 其中birthday 为MyDate类的对象;. 并为每一个属性定义 getter stt ...

  3. java集合方法之TreeSet.floor()和TreeSet.ceiling()

    floor(E e) 方法返回在这个集合中小于或者等于给定元素的最大元素,如果不存在这样的元素,返回null. ceiling(E e) 方法返回在这个集合中大于或者等于给定元素的最小元素,如果不存在 ...

  4. java集合光加_阳光沙滩-java集合:使用新建对象检查数组是否包含问题

    这样的问题很简单的,就算我从来没有学过java,我也可以找到答案. 第一种方法,看注释: /** * Returns true if this list contains the specified ...

  5. 笔记整理2----Java语言基础(二)06 断点调试与数据加密+07 面向对象-类与对象+08 java常用API-基础+09 java集合+10 IO流-基础

    06 断点调试与数据加密+07 面向对象-类与对象+08 java常用API-基础+09 java集合+10 IO流-基础 第06天 java基础语法 今日内容介绍  Eclipse断点调试  基 ...

  6. Java集合框架全解

    Collection 集合 集合接口有2个基本方法: public interface Collection<E> {//向集合中添加元素.如果添加元素确实改变了集合就返回 true, 如 ...

  7. Java 集合系列 16 HashSet

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  8. java基础—TreeSet集合中储存自定义对象(java集合二)

    TreeSet集合中储存学生对象,按照其年龄进行排序 TreeSet对元素进行排序的方式一: 让元素自身具备比较功能,元素就需要实现Comparable接口,覆盖compareTo方法. TreeSe ...

  9. Java集合(五):Set集

    在上一讲中介绍了散列映射表HashMap和树映射表TreeMap,知道了HashMap的底层实现机制.这一讲将介绍Set接口和实现类:HashSet和TreeSet.由于HashSet的实现是基于Ha ...

最新文章

  1. See the World 2015-6-10
  2. LSQL Developer连接Oracle11g 64位数据库配置详解
  3. LightGBM如何保存模型?
  4. 深入浅出的webpack构建工具---PostCss(五)
  5. java 数据库转储_从源控制数据库驱动的应用程序所需的转储开始?
  6. Scheme N皇后
  7. LOAD DATA INFILE 语法
  8. Leetcode 102. 二叉树的层次遍历
  9. 扩展progress_timer的计时精度
  10. Atlas读写分离Mysql集群的搭建
  11. dreamweaver php代码提示框,PHP 5.4中的Dreamweaver CS5代码提示和语法错误
  12. H3CSE(路由)学习笔记----下
  13. 网易云 NeteaseCloudMusicApi 码云下载
  14. 黑客帝国角色 之 尼奥解读
  15. 40个Qt学习小案例
  16. Tek TDS3054B保存波形的方法
  17. iOS控件使用和多样布局
  18. elementui表格鼠标滑轮控制横向滚动
  19. 从0开始的OpenGL学习(八)-显示3D立方体
  20. 金融借贷平台大数据风控解决方案

热门文章

  1. ac 梦幻布丁 启发式合并
  2. P1131 [ZJOI2007] 时态同步
  3. 牛客题霸 [ 验证IP地址] C++题解/答案
  4. 2020牛客国庆集训派对day1 Zeldain Garden
  5. YBTOJ洛谷P1407:稳定婚姻(强连通分量)
  6. YBTOJ:彩色圆环
  7. P3172-[CQOI2015]选数【dp,容斥】
  8. P4981-父子【数学,树】
  9. 【背包】作业(jzoj 1986)
  10. Link Cut Tree 学习笔记