English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Учебник по основам Java

Java Управление потоком

Java Массив

Java Ориентированный на объекты (I)

Java Ориентированный на объекты (II)

Java Ориентированный на объекты (III)

Обработка исключений Java

Java Список (List)

Java Queue (очередь)

Java Map множество

Java Set множество

Java Ввод/вывод (I/O)

Java Reader/Writer

Другие темы Java

Java TreeSet

В этом руководстве мы изучим 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<>();
        // Использование метода add()
        evenNumbers.add(2);
        evenNumbers.add(4);
        evenNumbers.add(6);
        System.out.println("TreeSet: " + evenNumbers);
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(1);
        // Использование метода addAll()
        numbers.addAll(evenNumbers);
        System.out.println("Новый TreeSet: " + numbers);
    }
}

Результат вывода

TreeSet: [2, 4, 6]
Новый TreeSet: [1, 2, 4, 6]

Аccess элементов TreeSet

Чтобы访问 элементы 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);
        // Вызов метода iterator()
        Iterator<Integer> iterate = numbers.iterator();
        System.out.print("TreeSet использует итератор: ");
        // Аccess elements
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

Результат вывода

TreeSet: [2, 5, 6]
TreeSet использует итератор: 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);
        // Использование метода remove()
        boolean value1 = numbers.remove(5);
        System.out.println("Удалился ли 5? " + value1);
        // Использование метода removeAll()
        boolean value2 = numbers.removeAll(numbers);
        System.out.println("Удалили все элементы? " + value2);
    }
}

Результат вывода

TreeSet: [2, 5, 6]
Удалился ли 5? true
Удалили все элементы? 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);
        // Использование метода first()
        int first = numbers.first();
        System.out.println("Первый номер: " + first);
        // Использование метода last()
        int last = numbers.last();
        System.out.println("Последний номер: " + last);
    }
}

Результат вывода

TreeSet: [2, 5, 6]
Первый номер: 2
Последний номер: 6

2. метод ceiling(), floor(), higher() и lower()

  • Higher(element) - Возвращает наименьший элемент, больший по значению чем заданный элемент (element).

  • lower(element) - Возвращает наибольший элемент, меньший по значению чем заданный элемент (element).

  • ceiling(element) - Возвращает наименьший элемент, больший по значению чем заданный элемент (element). Если переданный элемент存在于 множестве, то возвращается переданный элемент.

  • floor(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);
        // Использование higher()
        System.out.println("Использование higher: " + numbers.higher(4));
        // Использование lower()
        System.out.println("Использование lower: " + numbers.lower(4));
        // Использование ceiling()
        System.out.println("Использование ceiling: " + numbers.ceiling(4));
        // Использование floor()
        System.out.println("Использование floor: " + numbers.floor(3));
    }
}

Результат вывода

TreeSet: [2, 4, 5, 6]
Использование higher: 5
Использование lower: 2
Использование ceiling: 4
Использование 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);
        // Использование pollFirst()
        System.out.println("Удаление первого элемента: " + numbers.pollFirst());
        // Использование pollLast()
        System.out.println("Удаление последнего элемента: " + numbers.pollLast());
        System.out.println("Новый TreeSet: " + numbers);
    }
}

Результат вывода

TreeSet: [2, 4, 5, 6]
Удаление первого элемента: 2
Удаление последнего элемента: 6
Новый TreeSet: [4, 5]

4. Методы headSet(), tailSet() и subSet()

headSet(element, booleanValue)

Метод headSet() возвращает все элементы в множестве, которые предшествуют указанному элементу (переданному в качестве параметра).

Параметр booleanValue является опциональным. По умолчанию значение false.

Если значение booleanValue равно true, то该方法 возвращает все элементы до указанного, включая указанный элемент.

Например,

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);
        // Использование headSet() с default boolean значением
        System.out.println("Использование headSet без boolean значения: " + numbers.headSet(5));
        // Использование headSet() с specified boolean значением
        System.out.println("Использование headSet с boolean значением: " + numbers.headSet(5, true));
    }
}

Результат вывода

TreeSet: [2, 4, 5, 6]
Использование headSet без boolean значения: [2, 4]
Использование headSet с boolean значением: [2, 4, 5]

tailSet(element, booleanValue)

Метод tailSet() возвращает все элементы в множестве, которые следуют за указанным элементом (переданным в качестве параметра).

Параметр booleanValue является опциональным. По умолчанию значение true.

Если false передается в 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);
        // Использование tailSet() с default boolean значением
        System.out.println("Использование default boolean значения в tailSet() : " + numbers.tailSet(4));
        // Использование tailSet() с указанным布尔ным значением
        System.out.println("tailSet() с布尔ным значением: " + numbers.tailSet(4, false));
    }
}

Результат вывода

TreeSet: [2, 4, 5, 6]
Использование tailSet() с default布尔ным значением: [4, 5, 6]
tailSet() с布尔ным значением: [5, 6]

subSet(e1,pv1,e2,pv2)

Метод subSet() возвращает все элементы между e1 и e2, включая e1.

pv1 и pv2 являются опциональными параметрами.  Default pv1 составляет true, pv2 составляет false.

Если передать false в качестве pv1, то该方法 возвращает все элементы между e1 и e2, не включая e1.

Если передать true в качестве pv2, то该方法 возвращает все элементы между 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);
        // Использование subSet() с default布尔ным значением
        System.out.println("subSet() использует default布尔ное значение: " + numbers.subSet(4, 6));
        // Использование subSet() с указанным布尔ным значением
        System.out.println("subSet() использует指定的布尔ное значение: " + numbers.subSet(4, false, 6, true));
    }
}

Результат вывода

TreeSet: [2, 4, 5, 6]
subSet() использует	default布尔ное значение: [4, 5]
subSet() использует指定的布尔ное значение: [5, 6]

Методы операций множеств

Методы класса TreeSet можно использовать для выполнения различных операций над множествами.

Объединение множеств

Для выполнения объединения двух множеств мы используем метод 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);
        // Объединение двух множеств
        numbers.addAll(evenNumbers);
        System.out.println("Объединение: " + numbers);
    }
}

Результат вывода

TreeSet1: [2, 4]
TreeSet2: [1, 2, 3]
Объединение: [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);
        // 两个集合的交集
        numbers.retainAll(evenNumbers);
        System.out.println("Объединение множеств: " + numbers);
    }
}

Результат вывода

TreeSet1: [2, 4]
TreeSet2: [1, 2, 3]
Объединение множеств: [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);
        //Разность множеств
        numbers.removeAll(evenNumbers);
        System.out.println("Разность множеств: " + numbers);
    }
}

Результат вывода

TreeSet1: [2, 4]
TreeSet2: [1, 2, 3, 4]
Разность множеств: [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);
        //Проверка, является ли primeNumbers подмножеством numbers
        boolean result = numbers.containsAll(primeNumbers);
        System.out.println("TreeSet2 является подмножеством TreeSet1? " + result);
    }
}

Результат вывода

TreeSet1: [1, 2, 3, 4]
TreeSet2: [2, 3]
TreeSet2 является подмножеством TreeSet1? True

Другие методы TreeSet

МетодыОписание
clone()Создать копию TreeSet
contains()Искать указанный элемент в TreeSet и возвращать логическое значение
isEmpty()Проверить, пуст ли TreeSet
size()Вернуть размер TreeSet
clear()Удалить все элементы из TreeSet

TreeSet Vs. HashSet

TreeSet и HashSet реализуют интерфейс Set. Однако, между ними есть некоторые различия.

  • В отличие от HashSet, элементы в TreeSet хранятся в определенном порядке. Это связано с тем, что TreeSet также реализует интерфейс SortedSet.

  • TreeSet предоставляет методы для легкой навигации. Например first(), last(), headSet(), tailSet() и т.д. Это связано с тем, что TreeSet также реализует интерфейс NavigableSet.

  • Для базовых операций, таких как добавление, удаление, проверка наличия и размер, HashSet быстрее, чем TreeSet.

Сравнитель TreeSet

В всех вышеперечисленных примерах элементы TreeSet сортируются по умолчанию. Однако, мы также можем определить свой порядок элементов.

Для этого нам нужно создать свою класс сравнения, основанный на сортировке элементов в дереве. Например

import java.util.TreeSet;
import java.util.Comparator;
class Main {
    public static void main(String[] args) {
        // Создание TreeSet с использованием пользовательского сравнителя
        TreeSet<String> animals = new TreeSet<>(new CustomComparator());
        animals.add("Dog");
        animals.add("Zebra");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("TreeSet: " + animals);
    }
    // Создание класса сравнения
    public static class CustomComparator implements Comparator<String> {
        @Override
        public int compare(String animal1, String animal2) {
            int value =  animal1.compareTo(animal2);
            // элементы сортируются в обратном порядке
            if (value > 0) {
                return -1;
            }
            else if (value < 0) {
                return 1;
            }
            else {
                return 0;
            }
        }
    }
}

Результат вывода

TreeSet: [Zebra, Horse, Dog, Cat]

В примере выше мы создали TreeSet и передали класс CustomComparator в качестве параметра.

Класс CustomComparator реализует интерфейс Comparator.

Затем мы перезаписываем метод compare(). Теперь этот метод будет сортировать элементы в обратном порядке.