Java Set은 중복 요소 (또는 객체)가 없는 요소의 모음입니다. Java Set은 Collection 인터페이스를 확장하는 인터페이스입니다. List와 달리 Java Set은 순서가 없는 컬렉션이며, 요소에는 특정한 순서가 없습니다. Java Set은 요소를 삽입할 위치를 제어하지 않습니다. 즉, 색인을 사용하여 요소에 액세스하거나 목록에서 요소를 검색할 수 없습니다.
Java Set
이 섹션에서는 Java Set에 대한 몇 가지 중요한 포인트를 논의하겠습니다:
- Java Set 인터페이스는 Java Collections Framework의 구성원입니다.
- List와 달리 Set은 중복된 요소를 추가할 수 없습니다.
- Set은 최대 하나의 null 요소만 추가할 수 있습니다.
- Set 인터페이스에는 Java 8에서 spliterator라는 하나의 기본 메서드가 있습니다.
- List 및 배열과 달리 Set은 요소의 색인이나 위치를 지원하지 않습니다.
- Set은 제네릭을 지원하며 가능한 경우 사용해야합니다. Set과 함께 제네릭을 사용하면 런타임에서 ClassCastException을 피할 수 있습니다.
- Set 인터페이스 구현을 사용하여 고유한 요소를 유지할 수 있습니다.
자바 Set 클래스 다이어그램
자바 Set 인터페이스는 Collection 인터페이스를 확장합니다. Collection 인터페이스는 Iterable 인터페이스를 확장합니다. 자주 사용되는 일부 Set 구현 클래스는 HashSet, LinkedHashSet, TreeSet, CopyOnWriteArraySet 및 ConcurrentSkipListSet입니다. AbstractSet은 Set 인터페이스의 뼈대 구현을 제공하여 Set을 구현하는 데 필요한 노력을 줄입니다.
자바 Set 메서드
이 섹션에서는 유용한 자바 Set 메서드 중 일부에 대해 설명하겠습니다:
- int size(): Set에 있는 요소의 수를 가져옵니다.
- boolean isEmpty(): Set이 비어 있는지 확인합니다.
- boolean contains(Object o): 지정된 요소를 이 Set이 포함하면 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 Array to Set
리스트와 달리, Java 세트를 직접 배열로 변환할 수 없습니다. 왜냐하면 배열을 사용하여 구현되지 않았기 때문입니다. 따라서 배열을 세트로 볼 수 있는 Arrays 클래스를 사용할 수 없습니다. 다른 접근 방식을 사용할 수 있습니다. Arrays.asList() 메소드를 사용하여 배열을 리스트로 변환한 다음 이를 사용하여 세트를 만들 수 있습니다. 이 접근 방식을 사용하면 Java 배열을 세트로 변환할 수 있습니다. 이 접근 방식을 사용하여 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()을 사용하여 배열 요소를 주어진 Set으로 복사합니다. 아래와 같이 표시됩니다.
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을 Array로
이 섹션에서는 Set.toArray() 메서드를 사용하여 문자열의 Set을 문자열의 배열로 변환하는 프로그램을 작성합니다. 아래와 같이 표시됩니다.
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");
// Set을 배열로 변환
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에서 수행되는 가장 일반적인 작업은 추가, addAll, clear, size 등입니다. 아래는 공통 메서드 사용을 보여주는 간단한 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");
//글자에 세트 요소 추가
vowels.addAll(set);
System.out.println(vowels);
//세트를 비우기 위한 clear 예제
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");
vowelsSet.stream().forEach(System.out::println);
}
}
출력:-
a
e
u
i
o
Java SE 9 세트
Java SE 9 릴리스에서 Oracle Corp는 Set 인터페이스에 유용한 유틸리티 메서드를 추가할 예정입니다. 이를 몇 가지 간단하고 유용한 예제와 함께 이해하는 것이 좋습니다. 이를 학습하려면 “Java SE 9: 세트 팩토리 메서드”에서 제 자습서를 참조해주십시오. 이것이 자바에서 Set에 대한 간단한 요약입니다. 이 자바 세트 예제가 Set 컬렉션 프로그래밍을 시작하는 데 도움이 되기를 바랍니다. 제 자습서를 읽어 주셔서 감사합니다. 제 자습서를 좋아하시거나 문제나 제안이 있으시면 댓글을 남겨 주세요.
Source:
https://www.digitalocean.com/community/tutorials/java-set