본문 바로가기

JAVA/DAY 19 _ 23.09.12

Set

# Binary Tree (숫자찾기 게임 생각하기 - 계속 중간값 부르지?)

## Set
// - 중복된 요소를 허용하지 않고, 순서를 보장하지 않는 집합
// - 이는 자료의 고유성을 유지하고, 집합 연산(교집합, 합집합, 차집합 등)을 수행하기 위해 사용됨
// - ex) UpDown게임할때 중간값을 계속 부르지?
// --> Binary Tree(Root가 제일 위에있고, 17을 부르면 왼쪽은 ~16 오른쪽은 18~ 이렇게 계속 뻗어나가)
//
# 특징(로또 추첨이랑 특징이 비슷하군):
//
// 1. 중복 요소 허용하지 않음: Set은 동일한 요소를 중복해서 저장하지 않습니다.
// --> 따라서 Set 내에는 고유한 요소만 포함됩니다.
//
// 2. 순서를 보장하지 않음: Set은 요소의 저장 순서를 보장하지 않습니다.
// --> 즉, 요소를 저장한 순서대로 요소에 접근할 수 없습니다.(그래도 비교적 탐색은 빠르지)

// --> 운이 안좋으면 트리가 편향되어 한쪽을 주르륵 다~ 확인하고 없으면 다시 반대쪽을 봐야할수도....

//

//  3. 특정값을 추출하는 get이 없음

//
// 4. 출력 시 : 사실상 정렬이 돼서 나온다!

// HashSet 생성
Set<String> set = new HashSet<>();

// 요소 추가
set.add("사과");
set.add("바나나");
set.add("딸기");
set.add("바나나"); // 중복 요소, 추가되지 않음

// 요소 확인
System.out.println("Set에 있는 요소 수: " + set.size());

// 요소 순회 및 출력
for (String fruit : set) {
    System.out.println(fruit);
}

// 요소 제거
set.remove("사과");

// 제거 후 요소 순회 및 출력
System.out.println("사과를 제거한 후:");
for (String fruit : set) {
    System.out.println(fruit);
}

// Set 비우기
set.clear();

// 비운 후 요소 확인
System.out.println("Set 비운 후 요소 수: " + set.size());

// 1.  HashSet을 사용하여 Set을 생성하고, 중복 요소를 추가해도 중복되지 않음을 확인
// 2. 그 후 요소를 순회하여 출력하고, 일부 요소를 제거한 후 다시 순회하여 출력.

// 3. 마지막으로 Set을 비워 요소 수를 확인합니다.
 --> Set은 중복을 허용하지 않고 고유한 요소를 관리하므로,

      요소의 고유성을 유지하거나 집합 연산을 수행해야 하는 경우에 유용함

 

 

# 예시

// Tree

TreeSet<Integer> set = new TreeSet<>();		// 1) Integer로 래핑돼있음

set.add(10);
set.add(15);
set.add(7);
set.add(4);
set.add(15);	// (boolean타입의) add에서 return false를 추고, 추가되지 않겠지


// 2) int로 언박싱하기!
for(int add : set) {
    System.out.println(add);
}

// 출력 : 4, 7, 10, 15 
// --> Root부터 시작해서 무조건 제일 왼쪽으로가고, null값까지 출력, 다시 남은것중 제일 왼쪽...
// --> 알아서 작은것부터 정렬돼서 출력된다는거임!
// 간략히 표현하자면
class Node<E>{
	
	E value;
	Node<E> left;
	Node<E> right;

}

 

## SET의 주요 장점
// 1. 출력시 정렬돼서 나오는 것
// 2. add시 boolean타입을 거쳐서 중복을 안만드는 것
// 3. ★ contains --> 탐색이 빠르다!!!

## SET의 절대하면 안되는 API
// 1. remove는 절대절대 X (link하나가 빠지면 트리자체가 달라져서 재구성을 해야해...)

 

 

 

# 추가내용

TreeSet<AAA> set = new TreeSet<>();

AAA a1 = new AAA();
AAA a2 = new AAA();
AAA a3 = new AAA();
AAA a4 = new AAA();


set.add(a1);




// Comparable 인터페이스를 구현하여 해당 클래스의 인스턴스들을 비교할 수 있는 방법을 제공..
// deep하긴해. 이정도까지는 아직 X
class AAA implements Comparable<AAA>{
	
	int v1;
	int v2;
	
	@Override
	public int compareTo(AAA o) {
		
		if(this.v1 + this.v2 > o.v1 + o.v2) {
			return 1;
		}
		
		return -1;
		
	}

'JAVA > DAY 19 _ 23.09.12' 카테고리의 다른 글

자료구조 summary, 시간복잡도  (0) 2023.09.12
HashMap2  (0) 2023.09.12
HashMap  (4) 2023.09.12
Queue  (0) 2023.09.12
(collection framework의) Stack  (0) 2023.09.12