Java Set – это коллекция элементов (или объектов), не содержащая дублирующихся элементов. Java Set – это интерфейс, который расширяет интерфейс Collection. В отличие от списка (List), Java Set НЕ является упорядоченной коллекцией, у его элементов нет определенного порядка. Java Set НЕ предоставляет контроля над позицией, на которой можно вставить элемент. Вы не можете получить доступ к элементам по их индексу и также искать элементы в списке.
Java Set
В этом разделе мы обсудим несколько важных моментов о Java Set:
- Интерфейс Java Set является членом Java Collections Framework.
- В отличие от списка, Set НЕ ПОЗВОЛЯЕТ добавлять дублирующиеся элементы.
- Set позволяет добавлять не более одного элемента со значением null.
- Интерфейс Set имеет один метод по умолчанию в Java 8: spliterator.
- В отличие от списка и массивов, Set НЕ поддерживает индексы или позиции его элементов.
- Set поддерживает обобщения, и их следует использовать всякий раз, когда это возможно. Использование обобщений с Set избежит ClassCastException во время выполнения.
- Мы можем использовать реализации интерфейса Set для поддержания уникальных элементов.
Диаграмма классов Java Set
Интерфейс Java Set расширяет интерфейс Collection. Интерфейс Collection, в свою очередь, расширяет интерфейс Iterable. Некоторые из часто используемых классов реализации Set включают HashSet, LinkedHashSet, TreeSet, CopyOnWriteArraySet и ConcurrentSkipListSet. Абстрактный класс AbstractSet предоставляет скелетную реализацию интерфейса Set для уменьшения усилий при его реализации.
Методы Java Set
В этом разделе мы обсудим некоторые полезные методы Java Set:
- int size(): для получения количества элементов в наборе.
- boolean isEmpty(): для проверки, пуст ли набор или нет.
- boolean contains(Object o): возвращает true, если этот набор содержит указанный элемент.
- Iterator iterator(): возвращает итератор по элементам этого набора. Элементы возвращаются в произвольном порядке.
- Object[] toArray(): возвращает массив, содержащий все элементы этого набора. Если этот набор гарантирует порядок, в котором его элементы возвращаются итератором, этот метод должен возвращать элементы в том же порядке.
- boolean add(E e): Добавляет указанный элемент в этот набор, если его еще нет (необязательная операция).
- boolean remove(Object o): Удаляет указанный элемент из этого набора, если он присутствует (необязательная операция).
- boolean removeAll(Collection c): Удаляет из этого набора все его элементы, содержащиеся в указанной коллекции (необязательная операция).
- boolean retainAll(Collection c): Сохраняет только элементы в этом наборе, содержащиеся в указанной коллекции (необязательная операция).
- void clear(): Удаляет все элементы из набора.
- Iterator iterator(): Возвращает итератор по элементам в этом наборе.
Массив Java в Набор
В отличие от списка, мы не можем прямо преобразовать набор Java в массив, так как он НЕ реализован с использованием массива. Поэтому мы не можем использовать класс Arrays для получения представления массива в виде набора. Мы можем применить другой подход. Мы можем преобразовать массив в список, используя метод Arrays.asList(), а затем использовать его для создания набора. Используя этот подход, мы можем преобразовать массив Java в набор двумя способами. Давайте обсудим их по очереди, используя один простой пример. Подход-1 В этом подходе сначала нам нужно создать список, используя данный массив, и затем использовать его для создания набора, как показано ниже.
import java.util.*;
public class ArrayToSet {
public static void main(String[] args) {
String[] vowels = {"a","e","i","o","u"};
Set<String> vowelsSet = new HashSet>(Arrays.asList(vowels));
System.out.println(vowelsSet);
/**
* Unlike List, Set is NOt backed by array,
* so we can do structural modification without any issues.
*/
vowelsSet.remove("e");
System.out.println(vowelsSet);
vowelsSet.clear();
System.out.println(vowelsSet);
}
}
Подход 2 В этом подходе мы НЕ используем промежуточный список для создания множества из массива. Сначала создаем пустой HashSet, затем используем Collections.addAll(), чтобы скопировать элементы массива в указанное множество, как показано ниже.
import java.util.*;
public class ArrayToSet2 {
public static void main(String[] args) {
String[] vowels = {"a","e","i","o","u"};
Set<String> vowelsSet = new HashSet<>();
Collections.addAll(vowelsSet, vowels);
System.out.println(vowelsSet);
/**
* Unlike List, Set is NOt backed by array,
* so we can do structural modification without any issues.
*/
vowelsSet.remove("e");
System.out.println(vowelsSet);
vowelsSet.clear();
System.out.println(vowelsSet);
}
}
Вывод: Когда мы запускаем две вышеуказанные программы, мы получаем тот же вывод, что и показано ниже.
[a, e, u, i, o]
[a, u, i, o]
[]
Преобразование Java Set в массив
В этом разделе мы напишем программу для преобразования набора строк в массив строк с использованием метода Set.toArray(), как показано ниже.
import java.util.*;
public class SetToArray {
public static void main(String[] args) {
Set();
// пример добавления
vowelsSet.add("a");
vowelsSet.add("e");
vowelsSet.add("i");
vowelsSet.add("o");
vowelsSet.add("u");
// преобразование набора в массив
String strArray[] = vowelsSet.toArray(new String[vowelsSet.size()]);
System.out.println(Arrays.toString(strArray));
}
}
Вывод: Когда мы запускаем вышеуказанную программу, мы получаем следующий вывод, как показано ниже.
[a, e, u, i, o]
Сортировка Java Set
Как мы знаем, Set (HashSet) НЕ поддерживает сортировку элементов напрямую. Он сохраняет и отображает свои элементы в случайном порядке. Тем не менее, у нас есть несколько подходов для сортировки его элементов, как показано ниже:
import java.util.*;
public class SetSortingExample {
public static void main(String[] args) {
Set<Integer> intsSet = new HashSet<>();
Random random = new Random();
for (int i = 0; i {return (o2-o1);});
System.out.println("Reverse Sorting: " + intsList2);
// Approach-3
Set<Integer> sortedSet = new TreeSet<>(intsSet);
System.out.println("Sorted Set: " + sortedSet);
}
}
Вывод: Когда мы запускаем вышеуказанную программу, мы увидим следующий вывод.
[560, 864, 176, 657, 135, 103, 40, 123, 555, 589]
Natural Sorting: [40, 103, 123, 135, 176, 555, 560, 589, 657, 864]
Before Sorting: [560, 864, 176, 657, 135, 103, 40, 123, 555, 589]
Reverse Sorting: [864, 657, 589, 560, 555, 176, 135, 123, 103, 40]
Sorted Set: [40, 103, 123, 135, 176, 555, 560, 589, 657, 864]
Операции с общими элементами Java Set
Самые распространенные операции, выполняемые с использованием Java Set, включают добавление, добавление всех элементов, очистку, получение размера и т.д. Ниже приведен простой пример использования методов Java Set.
import java.util.*;
public class SetCommonOperations
{
public static void main(String args[])
{
Set vowels= new HashSet<>();
//пример добавления
vowels.add("A");
vowels.add("E");
vowels.add("I");
//Нельзя вставлять элементы на основе индекса в Set
System.out.println(vowels);
Set set = new HashSet<>();
set.add("O");
set.add("U");
//присоединение элементов set к буквам
vowels.addAll(set);
System.out.println(vowels);
//пример очистки для опустошения набора
set.clear();
//пример размера
System.out.println("letters set size = " + vowels.size());
vowels.clear();
vowels.add("E"); vowels.add("E");vowels.add("I"); vowels.add("O");
System.out.println("Given set contains E element or not? = " + vowels.contains("E"));
}
}
Вывод:-
[A, E, I]
[A, E, U, I, O]
letters set size = 5
Given set contains E element or not? = true
Итератор Java Set
Ниже приведен простой пример того, как выполнить итерацию по Java Set.
import java.util.*;
public class SetIteratorExample
{
public static void main(String[] args)
{
Set set = new HashSet<>();
for(int i=0; i<5; i++)
set.add(i);
Iterator iterator = set.iterator();
//простая итерация
while(iterator.hasNext()){
int i = (int) iterator.next();
System.out.print(i + ", ");
}
System.out.println("\n" + set);
//изменение набора с использованием итератора
iterator = set.iterator();
while(iterator.hasNext()){
int x = (int) iterator.next();
if(x%2 ==0) iterator.remove();
}
System.out.println(set);
//изменение структуры набора во время итерации
iterator = set.iterator();
while(iterator.hasNext()){
//Здесь возникает ConcurrentModificationException
int x = (int) iterator.next();
if(x==1) set.add(10);
}
}
}
Преобразование Java Set в Stream
Ниже приведен простой пример того, как преобразовать Java Set в Stream и выполнить некоторые операции в соответствии с нашими требованиями.
import java.util.*;
public class SetToStream {
public static void main(String[] args) {
Set vowelsSet = new HashSet<>();
//пример добавления
vowelsSet.add("a");
vowelsSet.add("e");
vowelsSet.add("i");
vowelsSet.add("o");
vowelsSet.add("u");
//преобразование set в поток
vowelsSet.stream().forEach(System.out::println);
}
}
Вывод:-
a
e
u
i
o
Набор Java SE 9
В выпуске Java SE 9 компания Oracle Corp собирается добавить несколько полезных утилитарных методов в интерфейс Set. Лучше всего понять их с помощью простых и полезных примеров. Пожалуйста, изучите мой учебник по адресу «Java SE 9: Методы создания множеств», чтобы ознакомиться с ними. Это всё, что я могу предложить в кратком обзоре о множестве в Java. Надеюсь, эти примеры использования множеств в Java помогут вам начать программирование с коллекциями Set. Спасибо за чтение моих учебников. Пожалуйста, оставьте комментарий, если вам понравились мои учебники, или если у вас есть какие-либо вопросы, предложения или замечания об ошибках.
Source:
https://www.digitalocean.com/community/tutorials/java-set