코딩 노트
Java.util.collection - Set 본문
비선형구조 - Set (인터페이스)
- Tree, Hash 등 여러 알고리즘으로 최적의 탐색이 가능하도록 만든 집합 저장소이다.
- 개별적인 항목에 대한 접근보다 전체적인 관점에서 데이터를 탐색해야 할 때 주로 사용한다.
TreeSet TreeMap / HashSet HastMap
- 시작과 끝이 구분이 어렵다.
- 둘 다 빠르게 전체 데이터를 찾고 검색하는 것이 목적이다.
- 중복이 발생할 수 없는 구조이다.
- 완성되어 있는 구조 그대로만 쓸 수 있다.
- 데이터를 쓰는 방법이 제한적이며, .get을 쓸 수 없다. (인덱스가 없기 때문에)
- 순서가 없기 때문에 .suffle()도 쓸 수 없다.
Set<Integer> a = new TreeSet<>();
Set<Integer> b = new HashSet<>();
TreeSet은 정렬이 필요할 때, hashSet는 정렬이 필요 없을 때 사용한다.
toggle
- 두 가지 상태를 왔다갔다 하는 것(ex. 스위치)
- 좋아요, 팔로우, 추천, 싫어요, 즐겨찾기, 구독, 알람, ...
Collection<? extends E>
- E 또는 E의 자식들 아무나 가능
컬렉션끼리는 데이터가 호환이 된다. List와 Set
set 안에 list의 데이터를 넣는 방법
List<Integer> list = List.of(10, 10, 20, 30);
Set<Integer> set = new TreeSet<>(list);
Q. list에 들어있는 데이터를 중복 제거하고 나열
Set을 이용하여 집합 연산 (합집합, 교집합, 차집합)
Set<Integer> a = Set.of(30,50,20); //java 9+만 이렇게 생성 가능
Set<Integer> b = Set.of(30,20,40,10); //java 9+
합집합(Union)
- 중복을 제거할 건지 제거하지 않을 건지
- 중복을 제거할 것이면 Set, 중복을 제거하지 않을 거라면 List를 쓴다.
합집합 - 중복을 제거한 코드
Set<Integer> union1 = new TreeSet<>();
union1.addAll(a);
union1.addAll(b);
System.out.println("합집합(중복제거) = " + union1);
합집합 - 중복을 제거하지 않은 코드
List<Integer> union2 = new ArrayList<>();
union2.addAll(a);
union2.addAll(b);
Collections.sort(union2);
System.out.println("합집합(중복허용) = " + union2);
교집합(Intersection)
- 두 집합이 모두 가진 요소들만으로 이루어진 집합
Set<Integer> inter = new TreeSet<>();
inter.addAll(a);
inter.retainAll(b); //겹치는 명령만 빼고 다 없애버림
System.out.println("교집합 = " + inter);
차집합(minus/except)
Set<Integer> minus = new TreeSet<>();
minus.addAll(a);
minus.removeAll(b);
System.out.println("a - b = " + minus);
확장반복(foreach)을 사용하여 Set 전체 출력
for(String name: all) {
System.out.println("name = " + name);
Q. 집합을 이용한 예제
- 철수와 영희가 둘 다 본 영화를 출력
- 철수와 영희 중 한 명만 본 영화를 출력
//집합 연산 문제
Set<String> a = Set.of("범죄도시3", "늑대사냥", "드림", "퍼펙트게임");
Set<String> b = Set.of("파수꾼", "늑대사냥", "리바운드", "익스트랙션2", "드림");
System.out.println("철수 = " + a);
System.out.println("영희 = " + b);
//[1] 둘 다 본 영화를 구하시오(교집합)
Set<String> both = new HashSet<>();
both.addAll(a);
both.retainAll(b);
System.out.println("둘 다 본 영화 = " + both);
//[2] 둘 중 한명만 본 영화를 구하시오
//(1) (a - b) ∪ (b - a) / (a-b)와 (b-a)를 합집합으로 구하는 법
//(2) (a ∪ b) - (a ∩ b) / (a b) 합집합에서 (a b)교집합을 빼는 법
//(1)
Set<String> a_b = new HashSet<>();
a_b.addAll(a);
a_b.removeAll(b);
Set<String> b_a = new HashSet<>();
b_a.addAll(b);
b_a.removeAll(a);
Set<String> result1 = new HashSet<>();
result1.addAll(a_b);
result1.addAll(b_a);
System.out.println("둘 중 한명만 본 영화 = " + result1);
//(2)
Set<String> all = new HashSet<>();
all.addAll(a);
all.addAll(b);
all.removeAll(both);
System.out.println("둘 중 한명만 본 영화 = " + all);
//Set도 전체 출력이 되긴 된다
//= 확장반복(foreach)은 가능
for(String name : all) {
System.out.println("name = " + name);
'Java' 카테고리의 다른 글
Java.util.collection - Stack, Queue (0) | 2023.07.14 |
---|---|
Java.util.collection - Map (0) | 2023.07.14 |
Java Class (0) | 2023.07.12 |
Java.util.collection - List (0) | 2023.07.12 |
java.util.scanner + java.util.random (0) | 2023.07.12 |