SortedSet接口
SortedSet是一个Set,它按升序维护其元素,根据元素的自然顺序或根据SortedSet创建时提供的Comparator进行排序,除了常规的Set操作外,SortedSet接口还提供以下操作:
范围视图 — 允许对已排序集进行任意范围操作。
端点 — 返回有序集合中的第一个或最后一个元素。
比较器访问 — 返回用于对集合进行排序的Comparator(如果有)。
下面是SortedSet接口的代码。
public interface SortedSetSet操作extends Set { // Range-view SortedSet subSet(E fromElement, E toElement); SortedSet headSet(E toElement); SortedSet tailSet(E fromElement); // Endpoints E first(); E last(); // Comparator access Comparator super E> comparator(); }
SortedSet从Set继承的操作在有序集和普通集上的行为相同,但有两个例外:
Iterator操作返回的iterator按顺序遍历有序集。
toArray返回的数组按顺序包含有序集的元素。
虽然接口不保证它,但Java平台的SortedSet实现的toString方法按顺序返回包含有序集的所有元素的字符串。
标准构造函数按照惯例,所有通用Collection实现都提供了一个带有Collection的标准转换构造函数,SortedSet实现也不例外,在TreeSet中,此构造函数创建一个实例,根据其自然顺序对其元素进行排序,这可能是一个错误,最好动态检查以查看指定的集合是否是SortedSet实例,如果是,则根据相同的标准(比较器或自然排序)对新TreeSet进行排序。因为TreeSet采用了它所采用的方法,所以它还提供了一个构造函数,它接受一个SortedSet并返回一个新的TreeSet,它包含根据相同标准排序的相同元素。请注意,它是参数的编译时类型,而不是其运行时类型,它确定调用这两个构造函数中的哪一个(以及是否保留了排序条件)。
按照惯例,SortedSet实现还提供了一个构造函数,它接受一个Comparator并返回一个根据指定的Comparator排序的空集,如果将null传递给此构造函数,则返回一个集合,该集合根据其自然顺序对其元素进行排序。
范围视图操作范围视图操作有点类似于List接口提供的操作,但有一个很大的区别,即使直接修改了后备排序集,排序集的范围视图仍然有效,这是可行的,因为有序集的范围视图的端点是元素空间中的绝对点,而不是后备集合中的特定元素,如列表的情况。排序集的范围视图实际上只是集合的任何部分位于元素空间的指定部分中的窗口,对范围视图的更改将写回到后备排序集,反之亦然,因此,与列表上的范围视图不同,可以在很长一段时间内对已排序的集使用范围视图。
排序集提供三种范围视图操作,第一个subSet采用两个端点,如subList,而不是索引,端点是对象,必须与有序集合中的元素相比较,使用Set的Comparator或其元素的自然顺序,无论Set使用哪个自定义,与subList一样,范围是半开放的,包括其低端点但不包括高端点。
因此,下面的代码行告诉你,包含在名为dictionary的字符串SortedSet中,“doorbell”和“pickle”之间有多少单词,包括“doorbell”,但不包括“pickle”:
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 + "