컬렉션 프레임워크 - 3. Set

Ⅲ. Set

1. Set (셋)

 - 수학에서의 집합과 동일한 구조를 지닌 자료구조

 

2. Set의 특징

 - 요소의 순서를 지정하지 않고 관리

 - 같은 요소가 두 번 이상 저장될 수 없음. 즉, 중복을 허용하지 않음

 

3. Set의 종류

 - HashSet(해시셋) : 해쉬코드를 이용해 중복을 예방하는 내부 로직을 가진 Set

 - TreeSet(트리셋) : 같은 Set이지만, 정렬 기능이 추가된 것 (오름,내림차순 같은 정렬)

    ※ 정렬(Sorting) : 일정한 규칙에 따라 나열한 것 (오름차순, 내림차순, ...)

 

4. HashSet의 기능

 - add( ) 메소드 : 요소 추가

    ※ Set은 순서가 없기 때문에 출력 시, for-each문을 사용

// Example
package sample;
import java.util.*;

// Set
public class Main {
	public static void main(String[] args) {
		// 제네릭 기반
		HashSet<String> a = new HashSet<>();
		
		// 요소를 추가할 땐 add() 메소드
		a.add("사과");
		a.add("바나나");
		a.add("포도");
		a.add("오렌지");
		a.add("사과");	// 중복은 제거됨
		// 객체를 추가할 때마다, hashCode() 와 equals()가 사용가능
		
		// for-each : 순서는 없지만 순차접근은 가능
		for(String s : a) {
			System.out.println(s);
		}
	}
}
// 결과 :
// 포도
// 오렌지
// 사과
// 바나나

 

5. TreeSet의 기능

 - add( ) 메소드 : 요소 추가

 - Iterartor 객체 : 요소를 순서대로 읽는 기능을 가짐

    ※ hasNext( ) : 읽을 것이 있으면 true를 반환 (없으면 false를 반환)

// Example
package sample;
import java.util.*;

public class Main {
	public static void main(String[] args) {
		TreeSet<Integer> a = new TreeSet<>();
		a.add(3);
		a.add(1);
		a.add(4);
		a.add(2);
		a.add(2);	// 중복은 제거됨
		
		// Set으로부터 '순차' 객체를 반환받아 읽을 수 있음
		// 순차 객체는 가지고 있는 요소를 읽는 기능을 포함
		Iterator b = a.iterator();
		while(b.hasNext()) {
			System.out.println(b.next() + " ");	// 실제 그 값을 읽고 다음으로 넘어감
		}
	}
}
// 결과 :
// 1 
// 2 
// 3 
// 4

 

 - TreeSet에  정렬 방법을 결정하는 '정렬 규칙' 객체를 전달할 수도 있음

    - Comparator 인터페이스를 사용하면, 정렬 규칙을 정의할 수 있음

// Example
package sample;

import java.util.*;

class abc implements Comparator<Integer> {
	// compare 추상메소드는 비교할 값 2개가 있어야함
	// compare가 0이나 음수이면 순서를 유지함, 양수이면 순서를 바꿈
	public int compare(Integer n1, Integer n2) {
		// n2(나중에 들어오는 값)에서 n1(먼저 들어오는 값)을 뺌
		return n2.intValue() - n1.intValue();
	}
	// 내림차순이 되었음
}


public class Main {
	public static void main(String[] args) {
		// abc객체를 TreeSet에 전달
		TreeSet<Integer> a = new TreeSet<>(new abc());
		
		a.add(3);
		a.add(1);
		a.add(4);
		a.add(2);
		a.add(2);	// 중복은 제거됨
		
		Iterator b = a.iterator();
		while(b.hasNext()) {
			System.out.println(b.next() + " ");
		}
	}
}
// 결과 :
// 4 
// 3 
// 2 
// 1

 

6. Set 예제

// Example
package sample;

import java.util.*;

class NumBox {
	int num;
	NumBox(int n) {
		this.num = n;
	}
	@Override
	public int hashCode() {
		return this.num;	// 값이 hashCode가 됨
	}
	@Override
	public boolean equals(Object obj) {
		if(this.num == ((NumBox)obj).num ) {
			return true;	// 둘이 같음
		} else {
			return false;	// 둘이 다름
		}
	}
	
}

public class Main {
	public static void main(String[] args) {
		HashSet<NumBox> a = new HashSet<>();
		
		a.add(new NumBox(1));
		a.add(new NumBox(1));
		a.add(new NumBox(3));
		a.add(new NumBox(3));
		
		for(NumBox k : a) {
			System.out.print(k.num + " ");	// 1 3 
		}
	}
}