Spec-Zone .ru
спецификации, руководства, описания, API
След: Наборы
Урок: Интерфейсы
Интерфейс SortedSet
Домашняя страница > Наборы > Интерфейсы

Интерфейс SortedSet

A SortedSet a Set это поддерживает его элементы в порядке возрастания, сортированный согласно естественному упорядочиванию элементов или согласно a Comparator если в SortedSet время создания. В дополнение к нормальному Set операции, SortedSet интерфейс обеспечивает операции для следующего:

Код для SortedSet интерфейс следует.

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 ведите себя тождественно на сортированных наборах и нормальных наборах с двумя исключениями:

Хотя интерфейс не гарантирует это, toString метод платформы Java SortedSet реализации возвращают строку, содержащую все элементы сортированного набора в порядке.

Стандартные Конструкторы

Условно, все общего назначения Collection реализации предоставляют стандартному конструктору преобразования, который берет a Collection; SortedSet реализации не являются никаким исключением. В TreeSet, этот конструктор создает экземпляр, который сортирует его элементы согласно их естественному упорядочиванию. Это было, вероятно, ошибкой. Было бы лучше проверить динамически, чтобы видеть, был ли указанный набор a SortedSet экземпляр и, если так, чтобы сортировать новое TreeSet согласно тому же самому критерию (компаратор или естественное упорядочивание). Поскольку TreeSet проявлял подход, который это сделало, это также предоставляет конструктору, который берет a SortedSet и возвращает новое TreeSet содержа те же самые элементы сортируется согласно тому же самому критерию. Отметьте, что это - тип времени компиляции параметра, не его тип времени выполнения, который определяет, кто из этих двух конструкторов вызывается (и сохраняется ли критерий сортировки).

SortedSet реализации также предоставляют, условно, конструктору, который берет a Comparator и возвращает пустое множество, сортированное согласно указанному Comparator. Если null передается этому конструктору, это возвращает набор, который сортирует его элементы согласно их естественному упорядочиванию.

Операции представления диапазона

range-view операции несколько походят на обеспеченных List интерфейс, но есть одна большая разница. Представления диапазона сортированного набора остаются допустимыми, даже если поддержка сортированный набор изменяется непосредственно. Это выполнимо, потому что конечные точки представления диапазона сортированного набора являются абсолютными точками в пространстве элемента, а не определенными элементами в отступающем наборе, как имеет место для списков. A range-view из сортированного набора действительно только окно на любую часть набора, находится в определяемой части пространства элемента. Изменения к range-view запишите обратно к поддержке сортированный набор и наоборот. Таким образом это должно хорошо использовать range-views на сортированных наборах в течение долгих промежутков времени, в отличие от этого range-views в списках.

Сортированные наборы обеспечивают три range-view операции. Первое, subSet, берет две конечных точки, как subList. А не индексы, конечные точки являются объектами и должны быть сопоставимыми с элементами в сортированном наборе, используя Set's Comparator или естественное упорядочивание его элементов, какой бы ни Set использование, чтобы упорядочить себя. Как subList, диапазон полуоткрыт, включая его низкую конечную точку, но, исключая высокий.

Таким образом следующая строка кода говорит Вам сколько слов между "doorbell" и "pickle", включая "doorbell" но, исключая "pickle", содержатся в a SortedSet из вызванных строк dictionary:

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). Хотя это не полностью очевидно, преемник строки s в String's естественное упорядочивание s + "\0" — то есть, s с a null символ добавляется.

Таким образом следующая острота говорит Вам сколько слов между "doorbell" и "pickle", включая дверной звонок и рассол, содержатся в словаре.

count = dictionary.subSet("doorbell", "pickle\0").size();

Подобный метод может использоваться, чтобы просмотреть открытый интервал, который не содержит никакую конечную точку. Представление открытого интервала от lowEndpoint к highEndpoint полуоткрытый интервал от successor(lowEndpoint) к highEndpoint. Используйте следующий, чтобы вычислить число слов между "doorbell" и "pickle", исключая обоих.

count = dictionary.subSet("doorbell\0", "pickle").size();

SortedSet интерфейс содержит еще два range-view операции — headSet и tailSet, оба из которых берут сингл Object параметр. Прежние возвраты представление начальной части поддержки SortedSet, до, но не включая указанный объект. Последние возвраты представление заключительной части поддержки SortedSet, начинание с указанного объекта и продолжение до конца поддержки SortedSet. Таким образом следующий код позволяет Вам просматривать словарь как два непересекающийся volumes (a-m и n-z).

SortedSet<String> volume1 = dictionary.headSet("n");
SortedSet<String> volume2 = dictionary.tailSet("n");

Операции конечной точки

SortedSet интерфейс содержит операции, чтобы возвратить первые и последние элементы в сортированном наборе, не удивительно вызванном first и last. В дополнение к их очевидному использованию, last позволяет обходное решение для недостатка в SortedSet интерфейс. Одна вещь требуется сделать с a SortedSet должен войти во внутреннюю часть Set и выполните итерации вперед или назад. Достаточно легко продвинуться от внутренней части: Только получите a tailSet и выполните итерации по этому. К сожалению, нет никакого легкого способа пойти назад.

Следующая идиома получает первый элемент, который является меньше чем указанный объект o в пространстве элемента.

Object predecessor = ss.headSet(o).last();

Это - прекрасный способ пойти один элемент назад от точки во внутренней части сортированного набора. Это могло быть применено неоднократно, чтобы выполнить итерации назад, но это очень неэффективно, требуя поиска для каждого возвращенного элемента.

Средство доступа компаратора

SortedSet интерфейс содержит вызванный метод средства доступа comparator это возвращается Comparator используемый, чтобы сортировать набор, или null если набор сортируется согласно естественному упорядочиванию его элементов. Этот метод обеспечивается так, чтобы сортированные наборы могли быть скопированы в новые сортированные наборы с тем же самым упорядочиванием. Это используется SortedSet конструктор описал ранее.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Объектное Упорядочивание
Следующая страница: Интерфейс SortedMap