本文详细介绍java api 接口篇(二)下
标准构造函数
按惯例,所有 Collection 实现都提供一个采用一种 Collection 的标准构造函数。SortedSet 实现也不例外。该构造函数创建了一个SortedSet 对象,它可按自然顺序为它的元素排序。除此之外,按惯例,SortedSet 实现还提供另外两个标准构造函数:
一个构造函数采用 Comparator 并返回一个新的(空的)按特定Comparator 排序的 SortedSet。
另一个构造函数采用 SortedSet 并返回一个新的包含与给定 SortedSet 相同的元素的 SortedSet, 它按照相同的Comparator进行排序 (或是用元素的自然顺序,如果给定的 SortedSet 也这样做过的话)。 请注意,决定该构造函数是否比普通 Set 构造函数可优先调用的是参数的编译时类型,而不是运行时类型!
第一个标准构造函数是用显式Comparator 创建一个空的 SortedSet 的一般方法。第二个标准构造函数在本质上与标准Collection 构造函数相似:它用同样的排序创建一个 SortedSet 的拷贝,但使用的是一个程序员指定的实现类型。
局域视图操作
这里的局域视图操作与 List 接口 提供的局域视图操作有些相似,但有一个大的区别。一个 sorted set 的局域视图将保持有效,即使后备 sorted set 被直接更改也不例外。这是可行的,因为一个 sorted set 的一个局域视图的端点是元素空间中的绝对点,而不是在后备 对象集 中的特定元素(如列表中的情况)。一个 sorted set 的局域视图实际恰恰是一个位于元素空间的指定部位的 set 的某个位置上的视窗。局域视图的变化写回到后备sorted set ,反之亦然。 因此,完全可以在 sorted sets 上长期使用局域视图 (与在列表上的局域视图不同)。
Sorted sets 提供三个局域视图操作。第一个是subSet,subSet 采用两个端点 (就象 subList中的操作一样)。该端点是对象,而不是索引。它们必须与 sorted set 中的元素是可比较的(使用 set 的 Comparator 或它的元素的自然排序,只要是 set 用来为自己排序的那一个)。就象 subList 一样,局域是半开放的(half-open), 它包括它的低端点,但不包括它的高端点。
于是,下面的一行程序将告知你在"doorbell" 和 "pickle"之间有多少个词(包括 "doorbell" 但不包括 "pickle")被包括在称作词典的串的 SortedSet 之中:
int count = dictionary.subSet("doorbell", "pickle").size();
类似的,下面的一行程序将删除所有以"f" 开始的元素(是不是一个很严厉的审查制度?):
dictionary.subSet("f", "g").clear();
你可以使用相似的技巧打印表格,并告知你以每个字母开始的词有多少:for (char ch="a"; ch$#@60;="z"; ch++) {
String from = new String(new char[] {ch});
String to = new String(new char[] {(char)(ch+1)});
System.out.println(from + ": " +
dictionary.subSet(from, to).size());
}
假设你要视图一个封闭的区间(closed interval) (两个端点都被包括)而不是一个开放的区间。如果该元素类型允许对一个给定值进行后继符(successor) 计算(在该元素空间), 那么, subSet 只要从 lowEndpoint 至 successor(highEndpoint) 发出请求。尽管这不是显而易见的,但是,在 String 的自然排序中的一个串 s 的后继符是 s+"" (即,s 加上一个空字符)。
于是,下面的一行程序将告知你在"doorbell" 和 "pickle"之间(包括 "doorbell" 和 "pickle")有多少词被包括在词典里:
dd$#@60;$#@62; int count = dictionary.subSet("doorbell", "pickle").size();
类似的技术也可被用来视图一个开放的区间(open interval) (两个端点都不被包括)。从lowEndpoint 至 highEndpoint 的开放区间视图是从 successor(lowEndpoint) 至 highEndpoint 的半开放区间。下列程序计算在"doorbell" 和 "pickle"之间的词汇数(不包括上述两个词):
int count = dictionary.subSet("doorbell", "pickle").size();
SortedSet 接口还包括另外两个局域视图操作, headSet 和 tailSet, 这两个操作均采用一个单一的 Object 参数。前者返回对后备 SortedSet 的初始部分的一个视图,一直到该特定对象,但不包括该特定对象;后者返回这个后备SortedSet 的最后部分的一个视图,它从这个特定对象开始,直到该后备 SortedSet 的结束。于是,下列代码允许你把该词典作为分开的两"卷"来视图(a-m 和 n-z):
SortedSet volume1 = dictionary.headSet("n");
SortedSet volume2 = dictionary.tailSet("n");
端点操作
SortedSet 接口返回 sorted set 中的第一个和最后一个元素的操作,称作 (不必惊讶) first 和 last。除了它们显而易见的用处外, last 还为 SortedSet 接口中的缺陷准备了一个工作区。 你在 SortedSet 上所要做的一件事情就是进入 set 的内部并向前或向后迭代。从内部向前迭代是非常容易的:只要采用tailSet 并在它上面迭代就可以了。不幸的是,没有向后迭代的简单途径。
下列惯用程序可获取在一个 sorted set中的第一个元素,在元素空间中它小于一个特定对象 o :
Object predecessor = ss.headSet(o).last();
这是从一个 sorted set 内部的一点向后"走过"一个元素的好办法。它可重复地应用于向后迭代。但不幸的是,它的效率太低,它要求查找返回的每一个元素。
比较器存取操作(Comparator Accessor)
SortedSet 接口包含一个被称作 comparator 的存取操作方法,它返回用来对 set 进行排序的 Comparator, 如果该 set 是按照它的元素的自然顺序排序的,则返回 null 。提供这个方法的目的是为了使 sorted sets 能被拷贝为一个新的排序相同的 sorted sets 。它被 以上 描述的标准 SortedSet 构造函数所采用。
责编:豆豆技术应用