Ⅲ. 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
}
}
}
'Programming Language > Java' 카테고리의 다른 글
컬렉션 프레임워크 - 5. Queue (0) | 2022.07.20 |
---|---|
컬렉션 프레임워크 - 4. Map (0) | 2022.07.19 |
컬렉션 프레임워크 - 2. List (0) | 2022.07.19 |
컬렉션 프레임 워크 - 1. 컬렉션 프레임워크 (Collection Framework) (0) | 2022.07.19 |
BigInteger Class (0) | 2022.07.18 |