Java Set – Set в Java

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:

  1. int size(): для получения количества элементов в наборе.
  2. boolean isEmpty(): для проверки, пуст ли набор или нет.
  3. boolean contains(Object o): возвращает true, если этот набор содержит указанный элемент.
  4. Iterator iterator(): возвращает итератор по элементам этого набора. Элементы возвращаются в произвольном порядке.
  5. Object[] toArray(): возвращает массив, содержащий все элементы этого набора. Если этот набор гарантирует порядок, в котором его элементы возвращаются итератором, этот метод должен возвращать элементы в том же порядке.
  6. boolean add(E e): Добавляет указанный элемент в этот набор, если его еще нет (необязательная операция).
  7. boolean remove(Object o): Удаляет указанный элемент из этого набора, если он присутствует (необязательная операция).
  8. boolean removeAll(Collection c): Удаляет из этого набора все его элементы, содержащиеся в указанной коллекции (необязательная операция).
  9. boolean retainAll(Collection c): Сохраняет только элементы в этом наборе, содержащиеся в указанной коллекции (необязательная операция).
  10. void clear(): Удаляет все элементы из набора.
  11. 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