SortedSet是一个Set,它按升序维护其元素,根据元素的天然顺序或根据SortedSet
建立时提供的Comparator
进行排序,除了常规的Set
操做外,SortedSet
接口还提供如下操做:html
Comparator
(若是有)。下面是SortedSet
接口的代码。java
public interface SortedSet<E> extends Set<E> { // Range-view SortedSet<E> subSet(E fromElement, E toElement); SortedSet<E> headSet(E toElement); SortedSet<E> tailSet(E fromElement); // Endpoints E first(); E last(); // Comparator access Comparator<? super E> comparator(); }
SortedSet
从Set
继承的操做在有序集和普通集上的行为相同,但有两个例外:segmentfault
Iterator
操做返回的iterator
按顺序遍历有序集。toArray
返回的数组按顺序包含有序集的元素。虽然接口不保证它,但Java平台的SortedSet
实现的toString
方法按顺序返回包含有序集的全部元素的字符串。api
按照惯例,全部通用Collection
实现都提供了一个带有Collection
的标准转换构造函数,SortedSet
实现也不例外,在TreeSet
中,此构造函数建立一个实例,根据其天然顺序对其元素进行排序,这多是一个错误,最好动态检查以查看指定的集合是不是SortedSet
实例,若是是,则根据相同的标准(比较器或天然排序)对新TreeSet
进行排序。由于TreeSet
采用了它所采用的方法,因此它还提供了一个构造函数,它接受一个SortedSet
并返回一个新的TreeSet
,它包含根据相同标准排序的相同元素。请注意,它是参数的编译时类型,而不是其运行时类型,它肯定调用这两个构造函数中的哪个(以及是否保留了排序条件)。数组
按照惯例,SortedSet
实现还提供了一个构造函数,它接受一个Comparator
并返回一个根据指定的Comparator
排序的空集,若是将null
传递给此构造函数,则返回一个集合,该集合根据其天然顺序对其元素进行排序。oracle
范围视图操做有点相似于List
接口提供的操做,但有一个很大的区别,即便直接修改了后备排序集,排序集的范围视图仍然有效,这是可行的,由于有序集的范围视图的端点是元素空间中的绝对点,而不是后备集合中的特定元素,如列表的状况。排序集的范围视图实际上只是集合的任何部分位于元素空间的指定部分中的窗口,对范围视图的更改将写回到后备排序集,反之亦然,所以,与列表上的范围视图不一样,能够在很长一段时间内对已排序的集使用范围视图。函数
排序集提供三种范围视图操做,第一个subSet
采用两个端点,如subList
,而不是索引,端点是对象,必须与有序集合中的元素相比较,使用Set
的Comparator
或其元素的天然顺序,不管Set
使用哪一个自定义,与subList
同样,范围是半开放的,包括其低端点但不包括高端点。code
所以,下面的代码行告诉你,包含在名为dictionary
的字符串SortedSet
中,“doorbell”和“pickle”之间有多少单词,包括“doorbell”,但不包括“pickle”:htm
int count = dictionary.subSet("doorbell", "pickle").size();
以相似的方式,如下单行删除以字母f
开头的全部元素。对象
dictionary.subSet("f", "g").clear();
相似的技巧能够用来打印一个表格,告诉你每一个字母开头有多少个单词。
for (char ch = 'a'; ch <= 'z'; ) { String from = String.valueOf(ch++); String to = String.valueOf(ch); System.out.println(from + ": " + dictionary.subSet(from, to).size()); }
假设你要查看包含其两个端点的封闭间隔,而不是开放的间隔,若是元素类型容许计算元素空间中给定值的后继,则仅从subSet
的lowEndpoint
请求到successor(highEndpoint)
,虽然它并不彻底明显,但String
的天然排序中的字符串s
的后继是s
+ "\0
" — 也就是说,附加了空字符的s
。
所以,下面的单行告诉你“doorbell”和“pickle”之间有多少单词,包括doorbell
和pickle
,都包含在字典中。
count = dictionary.subSet("doorbell", "pickle\0").size();
能够使用相似的技术来查看不包含端点的开放间隔,从lowEndpoint
到highEndpoint
的开放间隔视图是从successor(lowEndpoint)
到highEndpoint
的半开放间隔,使用如下内容计算“doorbell”和“pickle”之间的单词数,不包括二者。
count = dictionary.subSet("doorbell\0", "pickle").size();
SortedSet
接口包含另外两个范围视图操做 — headSet
和tailSet
,二者都采用单个Object
参数,前者返回后备SortedSet
的初始部分的视图,直到但不包括指定的对象,后者返回后备SortedSet
的最后一部分的视图,从指定的对象开始,一直到后备SortedSet
的末尾,所以,如下代码容许你将字典视为两个不相交的卷(a-m
和n-z
)。
SortedSet<String> volume1 = dictionary.headSet("n"); SortedSet<String> volume2 = dictionary.tailSet("n");
SortedSet
接口包含返回有序集合中第一个和最后一个元素的操做,绝不奇怪被称为first
和last
,除了它们的明显用途以外,last
还容许解决SortedSet
接口中的不足。你想对SortedSet
作的一件事就是进入Set
的内部并向前或向后迭代,从内部向前迭代很容易:只需获取一个tailSet
并迭代它,不幸的是,没有简单的方法能够倒退。
如下语法得到的元素空间中小于指定对象o
的第一个元素。
Object predecessor = ss.headSet(o).last();
这是从排序集内部的一个点向后移动一个元素的好方法,它能够重复应用以向后迭代,但这是很是低效的,须要查找返回的每一个元素。
SortedSet
接口包含一个名为comparator
的访问器方法,它返回用于对集合进行排序的Comparator
,若是集合根据其元素的天然顺序排序,则为null
,提供此方法以即可以将排序的集合复制到具备相同排序的新排序集合中,它由前面描述的SortedSet
构造函数使用。