코딩 노트

Java.util.collection - Set 본문

Java

Java.util.collection - Set

newbyeol 2023. 7. 13. 14:53

비선형구조 - 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. 집합을 이용한 예제

  1. 철수와 영희가 둘 다 본 영화를 출력
  2. 철수와 영희 중 한 명만 본 영화를 출력

//집합 연산 문제

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