前言
- {@link Set}进一步提供了其元素的总体排序。
- 元素使用其 可比自然排序 或通常在排序集创建时提供的 Comparator 进行排序。
- 集合的迭代器将以升序顺序遍历集合。提供了一些附加操作以利用排序的优势。
- (此接口和{@link SortedMap}的类似。)
- 插入排序集中的所有元素都必须实现Comparable接口(或被指定的比较器接受)。
- 此外,所有这些元素必须相互可比较:e1.compareTo(e2)(或比较器.compare(e1,e2))
- 不得为已排序集中的任何元素e1和e2 抛出ClassCastException。
- 尝试违反此限制将导致有问题的方法或构造函数调用引发ClassCastException。
- 请注意,如果排序集要正确实现Set接口,则排序集(无论是否提供显式比较器)所维护的顺序必须与equals一致。
- (有关与equals一致的精确定义,请参见Comparable接口或Comparator接口。)
- 之所以这样,是因为Set接口是根据equals操作定义的,但是排序后的set使用其compareTo(或compare)方法执行所有元素比较。
- 因此从排序集的角度来看,此方法认为相等的两个元素相等。
- 即使排序集的排序与equals不一致,也可以很好地定义其行为。它只是不遵守Set接口的一般约定。
- 所有通用排序集实现类都应提供四个“标准”构造函数:
- 1)一个void(无参数)构造函数,该构造函数将创建一个空的排序集,并根据其元素的自然顺序对其进行排序。
- 2)具有一个Comparator类型的单个参数的构造函数,该构造函数创建一个空的排序集,该集根据指定的比较器排序。
- 3)具有单个Collection类型参数的构造函数,该构造函数将创建一个新的排序集合,该集合具有与其参数相同的元素,并根据元素的自然顺序进行排序。
- 4)具有单个类型为SortedSet的参数的构造函数,该构造函数将创建一个新的排序集合,其元素与输入排序集合的元素和排序相同。由于接口不能包含构造函数,因此无法强制执行此建议。
- 注意:几种方法返回范围受限的子集。
- 这样的范围是半开的,也就是说,它们包括其低端点,但不包括其高端点(如果适用)。
- 如果您需要一个封闭范围(包括两个端点),并且元素类型允许计算给定值的后继对象,则只需请求从lowEndpoint到后继对象(highEndpoint)的子范围。
源码
public interface SortedSet<E> extends Set<E> {
/**
* 返回用于对集合中的元素进行排序的比较器;如果此集合使用其元素的{@linkplain可比自然排序},则返回null。
*/
Comparator<? super E> comparator();
/**
* 返回此集合部分的视图,其元素范围从fromElement(包括)到toElement(不包括)。
* (如果fromElement和toElement相等,则返回的集合为空。)
* 返回的集合受该集合支持,因此返回的集合中的更改将反映在该集合中,反之亦然。
* 返回的集合支持该集合支持的所有可选集合操作。
* 尝试插入超出其范围的元素时,返回的集合将引发IllegalArgumentException。
*/
SortedSet<E> subSet(E fromElement, E toElement);
/**
* 返回此集合中元素严格小于toElement的部分的视图。
* 返回的集合受此集合支持,因此返回的集合中的更改将反映在此集合中,反之亦然。
* 返回的集合支持该集合支持的所有可选集合操作。
* 尝试插入超出其范围的元素时,返回的集合将引发IllegalArgumentException。
*/
SortedSet<E> headSet(E toElement);
/**
* 返回此集合中元素大于或等于fromElement的部分的视图。
* 返回的集合受此集合支持,因此返回的集合中的更改将反映在此集合中,反之亦然。
* 返回的集合支持该集合支持的所有可选集合操作。尝试插入超出其范围的元素时,返回的集合将引发IllegalArgumentException。
*/
SortedSet<E> tailSet(E fromElement);
/**
* Returns the first (lowest) element currently in this set.
* 返回此集中当前的第一个(最低)元素。
* @return the first (lowest) element currently in this set
* @throws NoSuchElementException if this set is empty
*/
E first();
/**
* 返回当前在此集合中的最后一个(最高)元素。
*/
E last();
/**
* 在此排序集中的元素上创建一个{@code Spliterator}。
*/
@Override
default Spliterator<E> spliterator() {
return new Spliterators.IteratorSpliterator<E>(
this, Spliterator.DISTINCT | Spliterator.SORTED | Spliterator.ORDERED) {
@Override
public Comparator<? super E> getComparator() {
return SortedSet.this.comparator();
}
};
}
}
```