HashSet 정리
1) Set/HashSet
- 중복 허용 X, 순서 없음(정렬/삽입 순서 보장 X)
- Set 인터페이스 계열의 클래스
- 저장순서를 유지하지 않는다. 순서의 의미가 없다.
- 순서의 개념이 아니라 집합의 개념이므로 삽입한 순서대로 나오지 않을 수 있다.
- 인덱스 개념이 없으므로 get(index) 없음 → 반복은 보통 Iterator/for-each 사용
2) HashSet 주요 메서드 표
| 메서드 | 설명 |
| add(E e) | 요소 추가 (이미 있으면 무시, size 변동 없음) |
| addAll(Collection<? extends E>) | 여러 요소 한꺼번에 추가 |
| size() | 요소 개수 |
| isEmpty() | 비어 있으면 true |
| contains(Object o) | 특정 값 포함 여부 |
| remove(Object o) | 해당 값 삭제(true/false) |
| clear() | 전체 삭제 |
| iterator() | 반복자 반환(순회용) |
Iterator 메서드 미니표
| 메서드 | 설명 |
| hasNext() | 다음 요소 존재 여부 |
| next() | 다음 요소 반환 |
| remove() | 마지막 반환 요소 삭제(옵션) |
3) Ex09_HashSet — 기본 사용 & 순회
import java.util.HashSet;
import java.util.Iterator;
public class Ex09_HashSet {
public static void main(String[] args) {
HashSet<String> hs = new HashSet<>();
System.out.println(hs.size()); // 0
hs.add("banana");
hs.add("orange");
hs.add("banana"); // 중복 → 무시
hs.add("apple");
hs.add("grape");
hs.add("banana"); // 중복 → 무시
System.out.println(hs.size()); // 4 (banana, orange, apple, grape)
System.out.println(hs); // [grape, banana, orange, apple] 등 — 순서 보장 X
System.out.println(hs.isEmpty()); // false (요소가 있으므로)
System.out.println("==========Iterator==========");
Iterator<String> iter = hs.iterator();
while (iter.hasNext()) {
String s = iter.next();
System.out.println(s);
}
System.out.println("==========contains==========");
boolean c = hs.contains("까꿍"); // 포함 여부
System.out.println(c); // false
System.out.println("==========remove==========");
boolean r = hs.remove("apple");
System.out.println(r); // 삭제 성공:true, 실패:false
System.out.println(hs);
}
}
포인트
- isEmpty()는 비었을 때만 true; 요소가 있으면 false
4) Ex10_HashSet — 로또 번호 생성 (중복 제거 활용)
(A) for문으로 로또 생성
int i = 0;
int[] arr = new int[6];
while (true) {
arr[i] = (int)(Math.random() * 11) + 1; // 현재 1~11 범위
for (int j = 0; j < i; j++) {
if (arr[i] == arr[j]) { // 중복이면 다시 뽑기
arr[i] = (int)(Math.random() * 11) + 1;
j = -1; // 처음부터 재검사
}
}
i++;
if (i == 6) break;
}
System.out.println(java.util.Arrays.toString(arr));
- 📌 범위 주의: (int)(Math.random()*11)+1 → 1~11. 실제 로또와 같이 1~45가 필요하면 *45로 변경
(B) HashSet으로 로또 생성
java.util.HashSet<Integer> lt = new java.util.HashSet<>();
int count = 0;
while (lt.size() < 6) {
int ran = (int)(Math.random() * 45) + 1; // 1~45 권장
lt.add(ran); // 중복이면 자동 무시
count++;
}
System.out.println(lt);
System.out.println("반복횟수 : " + count);
- 조건은 lt.size() < 6 하나면 충분 → 중복 자동 제거
5) 마무리 요약
- HashSet은 중복 제거가 핵심, 순서 보장 없음
- 인덱스 접근 대신 Iterator/for-each로 순회
- 중복 없이 N개 뽑기 문제는 HashSet으로 간단히 해결 가능
- 로또 범위는 상황에 맞게 조정(예: 1~45)
'기초 및 언어 > ▶ Java&JSP' 카테고리의 다른 글
| 35. 바이트스트림 (0) | 2025.08.26 |
|---|---|
| 34. HashMap (1) | 2025.08.26 |
| 32. Vector와 Enumeration (1) | 2025.08.26 |
| 31. ArrayList (5) | 2025.08.24 |
| 30. 컬렉션(Collection) (0) | 2025.08.24 |