Сортированный список SortedSet в Java

Интерфейс Java SortedSet, java.util.SortedSet, является подтипом интерфейса java.util.Set. Ведет себя как обычный Set, за исключением того, что содержащиеся в нем элементы отсортированы внутри. Это означает, что когда вы перебираете элементы, они перебираются в отсортированном порядке.

Реализация отсортированного набора TreeSet

API коллекций имеет только одну реализацию интерфейса — класс java.util.TreeSet. В пакете java.util.concurrent также есть реализация этого интерфейса, но оставим утилиты параллелизма вне этого урока.

Как создать

Вот пример создания экземпляра:

SortedSet sortedSet = new TreeSet();

Как создать с компаратором

Это позволяет передать реализацию Comparator, java.util.Comparator в конструктор TreeSet. Затем этот компаратор решит порядок элементов в TreeSet:

Comparator comparator = new MyComparatorImpl();

SortedSet sortedSet = new TreeSet(comparator);

Порядок сортировки

Порядок по умолчанию — естественным порядком сортировки элементов. Для его определения элементы должны реализовывать интерфейс java.lang.Comparable.

Если элементы не реализуют его, они не имеют естественного упорядочения. В этом случае нужно передать реализацию Comparator в SortedSet при его создании. Класс TreeSet может принимать Comparator в своем конструкторе:

Comparator comparator = new MyComparator();

SortedSet sortedSet = new TreeSet(comparator);

По возрастанию или по убыванию

По умолчанию элементы в порядке возрастания, начиная с «наименьшего» и перемещаясь к «наибольшему». Но также возможно перебирать элементы в порядке убывания, используя метод TreeSet.descendingIterator():

TreeSet treeSet = new TreeSet();

treeSet.add("one");
treeSet.add("two");
treeSet.add("three");

Iterator iterator = treeSet.descendingIterator();
while(iterator.hasNext()) {
    String element =(String) iterator.next();
    System.out.println(element);
}

Как получить компаратор

Если вы создали свой SortedSet с помощью Comparator, вы можете получить этот Comparator с помощью метода comptor():

Comparator comparator = sortedSet.comparator();

Как добавить элементы

Вы добавляете элементы так же, как вы делаете это с обычным Set — через его метод add():

SortedSet sortedSet = new TreeSet();

sortedSet.add("one");

Как удалить элементы

Чтобы удалить элемент, вы вызываете его метод remove(), передавая элемент для удаления в качестве параметра:

sortedSet.remove("one");

Как получить первый элемент

Вы можете получить первый элемент в соответствии с порядком его сортировки, вызвав метод first():

Object firstElement = sortedSet.first();

Получение последнего элемента

Вы можете получить последний элемент в соответствии с порядком его сортировки, вызвав метод last():

Object lastElement = sortedSet.last();

Итерация

Способ итерации элементов аналогичен способу итерации обычного набора. Вы вызываете метод iterator(), который возвращает Iterator, и затем вы можете перебирать элементы через него:

SortedSet sortedSet = new TreeSet();

sortedSet.add("one");
sortedSet.add("two");
sortedSet.add("three");

Iterator iterator = sortedSet.iterator();
while(iterator.hasNext()) {
    String element =(String) iterator.next();
    System.out.println(element);
}

Как получить headSet

Интерфейс SortedSet имеет метод с именем headSet(). Он возвращает другой SortedSet со всеми элементами, которые меньше (перед) заданного значения параметра, в соответствии с используемым порядком сортировки:

SortedSet sortedSet = new TreeSet();

sortedSet.add("a");
sortedSet.add("b");
sortedSet.add("c");
sortedSet.add("d");
sortedSet.add("e");

SortedSet headSet = sortedSet.headSet("c");

После выполнения этого кода headSet будет содержать элементы «a» и «b», поскольку эти два элемента меньше (впереди) значения параметра «c», которое было передано методу headSet().

Как получить хвост

Интерфейс SortedSet имеет метод с именем setSet(). Он возвращает другой SortedSet со всеми элементами, которые больше или равны (привязаны) к заданному значению параметра в соответствии с используемым порядком сортировки:

SortedSet sortedSet = new TreeSet();

sortedSet.add("a");
sortedSet.add("b");
sortedSet.add("c");
sortedSet.add("d");
sortedSet.add("e");

SortedSet tailSet = sortedSet.tailSet("c");

После выполнения этого кода tailSet будет содержать элементы «c», «d» и «e», поскольку эти три элемента больше или равны (привязаны) значению параметра «c», которое было передано методу tailSet().

Как получить подмножество

Интерфейс SortedSet имеет метод с именем subSet(). Он будет возвращать новый SortedSet, являющийся подмножеством SortedSet, для которого вызывается метод subSet(). Метод принимает два значения параметров, определяющих, какие элементы должен содержать возвращаемый SortedSet.

Возвращенное подмножество будет содержать все элементы, равные или превышающие первый параметр, и меньшие, чем второй параметр, в соответствии с используемым порядком сортировки:

SortedSet sortedSet = new TreeSet();

sortedSet.add("a");
sortedSet.add("b");
sortedSet.add("c");
sortedSet.add("d");
sortedSet.add("e");

SortedSet subSet = sortedSet.subSet("c", "e");

После выполнения этого кода подмножество будет содержать элементы «c» и «d», поскольку они равны или больше, чем «c» (первый параметр), и меньше, чем «e» (второй параметр).

Общий

Когда вы объявляете переменную типа SortedSet, вы можете установить универсальный тип для нее. :

SortedSet sortedSet = new TreeSet<>();

Этот SortedSet теперь может содержать только объекты String в качестве элементов. Среди прочего, это означает, что вам больше не нужно приводить объекты в строковый тип. Вот пример итерации универсального типа String:

SortedSet sortedSet = new TreeSet<>();

sortedSet.add("one");
sortedSet.add("two");
sortedSet.add("three");

Iterator iterator = sortedSet.iterator();
while(iterator.hasNext()) {
    String element = iterator.next();
    System.out.println(element);
}

Обратите внимание, что больше не требуется приведение объекта, возвращенного из iterator.next(). Поскольку универсальным типом является String, и компилятор знает, что итератор возвращает объекты String.

Оцените статью