Набор деревьев Java
Набор деревьев Java
В этом руководстве мы узнаем о классе Java TreeSet и его различных операциях и методах с помощью примеров.
TreeSet
класс платформы коллекций Java обеспечивает функциональность древовидной структуры данных.
Он расширяет интерфейс NavigableSet.
<час>
Создание TreeSet
Чтобы создать набор деревьев, мы должны импортировать java.util.TreeSet
сначала пакет.
Как только мы импортируем пакет, вот как мы можем создать TreeSet
на Java.
TreeSet<Integer> numbers = new TreeSet<>();
Здесь мы создали TreeSet
без всяких аргументов. В этом случае элементы в TreeSet
сортируются естественным образом (по возрастанию).
Однако мы можем настроить сортировку элементов с помощью Comparator
интерфейс. Мы узнаем об этом позже в этом руководстве.
Методы TreeSet
TreeSet
класс предоставляет различные методы, которые позволяют нам выполнять различные операции над набором.
Вставить элементы в TreeSet
add()
- вставляет указанный элемент в наборaddAll()
- вставляет в набор все элементы указанной коллекции
Например,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
// Using the add() method
evenNumbers.add(2);
evenNumbers.add(4);
evenNumbers.add(6);
System.out.println("TreeSet: " + evenNumbers);
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
// Using the addAll() method
numbers.addAll(evenNumbers);
System.out.println("New TreeSet: " + numbers);
}
}
Вывод
TreeSet: [2, 4, 6] New TreeSet: [1, 2, 4, 6]<час>
Доступ к элементам TreeSet
Чтобы получить доступ к элементам набора деревьев, мы можем использовать iterator()
метод. Чтобы использовать этот метод, мы должны импортировать java.util.Iterator
упаковка. Например,
import java.util.TreeSet;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
// Calling iterator() method
Iterator<Integer> iterate = numbers.iterator();
System.out.print("TreeSet using Iterator: ");
// Accessing elements
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
Вывод
TreeSet: [2, 5, 6] TreeSet using Iterator: 2, 5, 6,<час>
Удалить элементы
remove()
- удаляет указанный элемент из набораremoveAll()
- удаляет все элементы из набора
Например,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
// Using the remove() method
boolean value1 = numbers.remove(5);
System.out.println("Is 5 removed? " + value1);
// Using the removeAll() method
boolean value2 = numbers.removeAll(numbers);
System.out.println("Are all elements removed? " + value2);
}
}
Вывод
TreeSet: [2, 5, 6] Is 5 removed? true Are all elements removed? true<час>
Способы навигации
Поскольку TreeSet
класс реализует NavigableSet
, он предоставляет различные методы для навигации по элементам древовидного набора.
1. Методы first() и last()
first()
- возвращает первый элемент набораlast()
- возвращает последний элемент набора
Например,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
// Using the first() method
int first = numbers.first();
System.out.println("First Number: " + first);
// Using the last() method
int last = numbers.last();
System.out.println("Last Number: " + last);
}
}
Вывод
TreeSet: [2, 5, 6] First Number: 2 Last Number: 6<час>
2. Методы потолка(), пола(), выше() и ниже()
- выше(элемент) - Возвращает самый низкий элемент среди тех элементов, которые больше указанного
element
.<суп>суп> - нижний(элемент) - Возвращает наибольший элемент среди тех элементов, которые меньше указанного
element
. - потолок(элемент) - Возвращает наименьший элемент среди тех элементов, которые больше указанного элемента . Если элемент переданный существует в наборе деревьев, он возвращает
element
передается как аргумент. - пол(элемент) - Возвращает наибольший элемент среди тех элементов, которые меньше указанного
element
. Если элемент переданный существует в наборе деревьев, он возвращаетelement
передается как аргумент.
Например,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
// Using higher()
System.out.println("Using higher: " + numbers.higher(4));
// Using lower()
System.out.println("Using lower: " + numbers.lower(4));
// Using ceiling()
System.out.println("Using ceiling: " + numbers.ceiling(4));
// Using floor()
System.out.println("Using floor: " + numbers.floor(3));
}
}
Вывод
TreeSet: [2, 4, 5, 6] Using higher: 5 Using lower: 2 Using ceiling: 4 Using floor: 2<час>
3. Методы pollfirst() и pollLast()
pollFirst()
- возвращает и удаляет первый элемент из набораpollLast()
- возвращает и удаляет последний элемент из набора
Например,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
// Using pollFirst()
System.out.println("Removed First Element: " + numbers.pollFirst());
// Using pollLast()
System.out.println("Removed Last Element: " + numbers.pollLast());
System.out.println("New TreeSet: " + numbers);
}
}
Вывод
TreeSet: [2, 4, 5, 6] Removed First Element: 2 Removed Last Element: 6 New TreeSet: [4, 5]<час>
4. Методы headSet(), tailSet() и subSet()
<час>headSet(элемент, логическое значение)
headSet()
метод возвращает все элементы набора дерева до указанного элемента (который передается в качестве аргумента).
логическое значение параметр является необязательным. Его значение по умолчанию — false
. .
Если true
передается как booleanValue , метод возвращает все элементы до указанного элемента, включая указанный элемент.
Например,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
// Using headSet() with default boolean value
System.out.println("Using headSet without boolean value: " + numbers.headSet(5));
// Using headSet() with specified boolean value
System.out.println("Using headSet with boolean value: " + numbers.headSet(5, true));
}
}
Вывод
TreeSet: [2, 4, 5, 6] Using headSet without boolean value: [2, 4] Using headSet with boolean value: [2, 4, 5]<час>
tailSet(элемент, логическое значение)
tailSet()
метод возвращает все элементы набора дерева после указанного элемента (который передается как параметр), включая указанный элемент .
логическое значение параметр является необязательным. Его значение по умолчанию — true
. .
Если false
передается как booleanValue , метод возвращает все элементы после указанного element без включения указанного элемента .
Например,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
// Using tailSet() with default boolean value
System.out.println("Using tailSet without boolean value: " + numbers.tailSet(4));
// Using tailSet() with specified boolean value
System.out.println("Using tailSet with boolean value: " + numbers.tailSet(4, false));
}
}
Вывод
TreeSet: [2, 4, 5, 6] Using tailSet without boolean value: [4, 5, 6] Using tailSet with boolean value: [5, 6]<час>
поднабор(e1, bv1, e2, bv2)
subSet()
метод возвращает все элементы между e1 и e2 включая e1 .
bv1 и bv2 являются необязательными параметрами. Значение по умолчанию bv1 это true
, и значение по умолчанию bv2 это false
.
Если false
передается как bv1 , метод возвращает все элементы между e1 и e2 без включения e1
.
Если true
передается как bv2 , метод возвращает все элементы между e1 и e2 , включая e1 .
Например,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
// Using subSet() with default boolean value
System.out.println("Using subSet without boolean value: " + numbers.subSet(4, 6));
// Using subSet() with specified boolean value
System.out.println("Using subSet with boolean value: " + numbers.subSet(4, false, 6, true));
}
}
Вывод
TreeSet: [2, 4, 5, 6] Using subSet without boolean value: [4, 5] Using subSet with boolean value: [5, 6]<час>
Операции с наборами
Методы TreeSet
class также можно использовать для выполнения различных операций над множествами.
Союз наборов
Чтобы выполнить объединение двух наборов, мы используем addAll()
метод. Например,
import java.util.TreeSet;;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("TreeSet1: " + evenNumbers);
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
System.out.println("TreeSet2: " + numbers);
// Union of two sets
numbers.addAll(evenNumbers);
System.out.println("Union is: " + numbers);
}
}
Вывод
TreeSet1: [2, 4] TreeSet2: [1, 2, 3] Union is: [1, 2, 3, 4]<час>
Пересечение наборов
Чтобы выполнить пересечение двух множеств, мы используем retainAll()
метод. Например,
import java.util.TreeSet;;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("TreeSet1: " + evenNumbers);
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
System.out.println("TreeSet2: " + numbers);
// Intersection of two sets
numbers.retainAll(evenNumbers);
System.out.println("Intersection is: " + numbers);
}
}
Вывод
TreeSet1: [2, 4] TreeSet2: [1, 2, 3] Intersection is: [2]<час>
Разница наборов
Чтобы вычислить разницу между двумя наборами, мы можем использовать removeAll()
метод. Например,
import java.util.TreeSet;;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("TreeSet1: " + evenNumbers);
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
System.out.println("TreeSet2: " + numbers);
// Difference between two sets
numbers.removeAll(evenNumbers);
System.out.println("Difference is: " + numbers);
}
}
Вывод
TreeSet1: [2, 4] TreeSet2: [1, 2, 3, 4] Difference is: [1, 3]<час>
Подмножество набора
Чтобы проверить, является ли набор подмножеством другого набора, мы используем containsAll()
метод. Например,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
System.out.println("TreeSet1: " + numbers);
TreeSet<Integer> primeNumbers = new TreeSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
System.out.println("TreeSet2: " + primeNumbers);
// Check if primeNumbers is subset of numbers
boolean result = numbers.containsAll(primeNumbers);
System.out.println("Is TreeSet2 subset of TreeSet1? " + result);
}
}
Вывод
TreeSet1: [1, 2, 3, 4] TreeSet2: [2, 3] Is TreeSet2 subset of TreeSet1? True<час>
Другие методы TreeSet
Метод | Описание |
---|---|
clone() | Создает копию TreeSet |
contains() | Ищет в TreeSet указанный элемент и возвращает логический результат |
isEmpty() | Проверяет, соответствует ли TreeSet пусто |
size() | Возвращает размер TreeSet |
clear() | Удаляет все элементы из TreeSet |
Чтобы узнать больше, посетите сайт Java TreeSet (официальная документация по Java).
<час>TreeSet vs. Набор хешей
Оба TreeSet
а также HashSet
реализует Set
интерфейс. Однако между ними существуют некоторые различия.
- В отличие от
HashSet
, элементы вTreeSet
хранятся в некотором порядке. Это потому, чтоTreeSet
реализуетSortedSet
интерфейс. TreeSet
предоставляет некоторые методы для легкой навигации. Например,first()
,last()
,headSet(
),tailSet()
и т. д. Это потому, чтоTreeSet
также реализуетNavigableSet
интерфейс.HashSet
быстрее, чемTreeSet
для основных операций, таких как добавление, удаление, содержание и размер.
Компаратор TreeSet
Во всех приведенных выше примерах элементы набора деревьев сортируются естественным образом. Однако мы также можем настроить порядок элементов.
Для этого нам нужно создать собственный класс компаратора на основе того, какие элементы в древовидном наборе сортируются. Например,
import java.util.TreeSet;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
// Creating a tree set with customized comparator
TreeSet<String> animals = new TreeSet<>(new CustomComparator());
animals.add("Dog");
animals.add("Zebra");
animals.add("Cat");
animals.add("Horse");
System.out.println("TreeSet: " + animals);
}
// Creating a comparator class
public static class CustomComparator implements Comparator<String> {
@Override
public int compare(String animal1, String animal2) {
int value = animal1.compareTo(animal2);
// elements are sorted in reverse order
if (value > 0) {
return -1;
}
else if (value < 0) {
return 1;
}
else {
return 0;
}
}
}
}
Вывод
TreeSet: [Zebra, Horse, Dog, Cat]
В приведенном выше примере мы создали набор деревьев, передав CustomComparator класс в качестве аргумента.
Пользовательский компаратор класс реализует Comparator
интерфейс.
Затем мы переопределяем compare()
метод. Теперь метод будет сортировать элементы в обратном порядке.
Чтобы узнать больше, посетите Java Comparator (официальная документация по Java).
java