java集合——树集(TreeSet)+对象的比较

【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):构造一个树集, 将有序集中的所有元素添加到这个树集中, 并使用与给定集合相同的元素比较器;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php curl伪装cookies,php curl 添加cookie伪造登陆抓取数据

有的网页必须登陆才能看到&#xff0c;这个时候想要抓取信息必须在header里面传递cookie值才能获取1、首先登陆网站&#xff0c;打开firebug就能看到对应的cookie把这些cookie拷贝出来就能使用了2、<?php header("Content-type:text/html;Charsetutf8");$ch curl…

JavaFX之TableView的TableRow

TableRow 通过TableView的setRowFactory,对行的双击进行操作 tableView.setRowFactory(new Callback<TableView<T>, TableRow<T>>() { Override public TableRow<T> call(TableView<T> param) { return new TableRowControl(); }…

rpc结构错误_结构性错误

rpc结构错误团队成员在使用以下代码时遇到了麻烦&#xff1a; void extractData(String targetUri) { Path tempFile createTempFilePath(); extractDataToPathAndUpload(tempFile, targetUri); cleanUp(tempFile); } void extractDataToPathAndUpload(Path tempFile, Stri…

zabbix前端php界面,Zabbix Web UI

PS&#xff1a;其实安装zabbix很简单&#xff0c;网上资料一搜一大把&#xff0c;基本都是采用yum方式安装&#xff0c;简单省事。正因如此我没写相关配置文档&#xff0c;安装方式一般用yum安装或源码安装亦或是容器安装&#xff0c;最近有网友提出来了&#xff0c;我认真对待…

Comparable与Comparator的区别

【0】README 0.1&#xff09;本文章节一&#xff08;除开 Conclusion内容&#xff09;转自&#xff1a; http://blog.csdn.net/mageshuai/article/details/3849143 0.2&#xff09; 余下内容均为原创&#xff0c;包括源代码&#xff1b; 【1】Comparable与Comparator的区别&a…

JavaFX之TableView的MenuButton

MenuButton 在JavaFx的 TableView 上可以使用MenuButton来管理TableView的Column. 启用MenuButton. TableView.setTableMenuButtonVisible(true); 但是普通的MenuButton, 每次点击都会刷新TableView 重写TableMenuButton的事件 [java] view plaincopy 找到tableView 的 …

java 读取 文本块_Java 13:文本块

java 读取 文本块Java 13已交付了期待已久的多行字符串或Text Blocks 。 您不再需要连接跨越多行的字符串或转义特殊字符&#xff0c;这确实提高了代码的可读性。 文本块是一种预览语言功能 &#xff0c;这意味着必须使用--enable-preview标志在Java编译器和运行时中明确启用它…

php 崩溃 输出,php – 创建可崩溃的print_r()var_dump()的函数?

你可能熟悉print_r的这个输出&#xff1a;Hierarchy Object([parent:private] > Hierarchy Object([parent:private] >[children:private] > Array()[level:private] > 0[price_modes:private] > Array()[id:protected] >[left_id:protected] >[right_id:…

JavaFX之TableView的SelectionMode

SelectionMode table默认是只能选着一行的&#xff0c;如果想选着多行&#xff0c;设置SelectionMode,此时可以对选中的多个进行监听。 [java] view plaincopy ListChangeListener<Person> indicesListener new ListChangeListener<Person>() { …

Comparable and Comparator API

【0】README 0.1&#xff09;文本全文翻译于 java 8 JDK 官方文档中关于 Comparable and Comparator 的描述&#xff1b; 0.2&#xff09;能力有限&#xff0c;仅供参考&#xff1b; 【1】 Interface Comparable 1.0&#xff09;类型参数&#xff1a; 与本对象进行比较的另一…

sql2008 sql服务_SQL即服务

sql2008 sql服务自2007年以来&#xff0c;我一直在考虑这一点&#xff0c;大约在Amazon 推出 S3时。 我什至尝试实现了几次&#xff0c;但是在设计阶段之后就失败了。 我听说过一家初创公司也尝试这样做&#xff0c;但也失败了 。 我仍然不确定是否可以这样做&#xff0c;但是它…

dede rss.php,DeDeCMS dede 织梦cms RSS全站静态输出的实现方法

DedeCMS自带Rss功能&#xff0c;在管理后台可以生成出一个Rss地图页面&#xff0c;默认是/data/rssmap.html&#xff1b;这个Html地图文件会告知用户每个栏目的rss订阅地址&#xff0c;这个功能很适合栏目及文章较多的网站&#xff0c;但不太适合文章页不多的小型站点&#xff…

java之注解

注解使用一、java的常用注解 Override 重写覆盖方法 SuppressWarnings 压住警告可用于类和方法 Deprecated 声明类或方法过时 注解Override用在方法上&#xff0c;当我们想重写一个方法时&#xff0c;在方法上加Overr…

java集合——队列和双端队列+优先级队列

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java集合——队列和双端队列优先级队列 的相关知识&#xff1b; 0.2&#xff09; for full source code , please visit https://github.com/pacosonTang/core-j…

java无效的源发行版_无效的Java

java无效的源发行版也许我可以被机器人代替进行代码审查。 有一些反馈我发现自己一遍又一遍。 这是我最不喜欢的一些&#xff1a; 通用代码结构 放弃其他 当if在两端return的else是多余的和不必要的创建缩进。 if (foo) { return bar; } else { return baz; } // should be…

oracle数值型转为char类型,PLSQL: Oracle函数to_char转化数字型指定小数点位数的技巧...

问题题出&#xff1a; 数字0.023 > 转化成字符串"0.023"问题难点&#xff1a;to_char&#xff0c;函数功能&#xff0c;就是将数值型或者日期型转化为字符型。比如最简单的应用&#xff1a;Select TO_CHAR(1.0123) FROM DUALSelect TO_CHAR(123) …

java之常用方法

一、数学函数 在System.Math类里面的函数 I、三角函数 sin(radians) 正弦函数 cos(radians) 余弦函数 tan(radians) 正切函数 toRadians(degree) 角度转为弧度 toDegree(radians) 弧度转为角度 asin(a) 反正弦函数 acos(a)…

java集合——映射表+专用集合映射表类

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java集合——映射表专用集合映射表类 的相关知识&#xff1b; 0.2&#xff09; for full source code , please visit https://github.com/pacosonTang/core-jav…

jstat分析_jstat –分析

jstat分析jstat是一个简单的实用工具&#xff0c;在JDK中存在&#xff0c;用于提供与JVM性能相关的统计信息&#xff0c;例如垃圾收集&#xff0c;编译活动。 jstat的主要优势在于&#xff0c;它可以在运行JVM且无需任何先决条件的情况下动态捕获这些指标。 这是什么意思&#…

oracle中execute函数,oracle Execute Immediate(sql语句)

慕尼黑的夜晚无繁华Example 1:Output:ABCDECLARE TYPE var_typ IS TABLE OF VARCHAR2(4000);cVars var_typ;cVar VARCHAR2(4000);BEGINEXECUTE IMMEDIATE SELECT A cc FROM dualUNIONSELECT B cc FROM dualUNIONSELECT C cc FROM dual BULK COLLECT INTO cVars; FOR i IN 1 .…