티스토리 뷰
Set
: 중복된 값을 저장하지 않는 집합(Set) 자료구조의 기능을 정의하는 인터페이스.
- Set은 순서에 상관없이 요소를 저장하며, 중복된 값을 허용하지 않음.
- 대표적인 클래스로는 HashSet, TreeSet, LinkedHashSet이 있음.
HashSet
: 해시 테이블(hash table)을 구현한 클래스, 가장 빠른 검색 속도를 제공.
- 순서를 보장하지 않지만, 중복된 값을 허용하지 않음
TreeSet
: 이진 검색 트리(binary search tree)를 구현한 클래스로, 요소를 자동으로 정렬함.
- TreeSet은 검색 속도가 빠르지만, HashSet보다는 느리다.
LinkedHashSet
: LinkedHashSet은 해시 테이블과 연결 리스트(linked list)를 결합한 클래스.
- 요소를 삽입한 순서대로 저장.
- LinkedHashSet은 HashSet과 비슷한 검색 속도를 제공하면서 순서를 보장한다
- 주로 이터레이터(Iterator) 활용
주요 메서드
메서드 이름 | 설명 |
boolean add(E e) | - Set에 요소를 추가합니다. - 추가에 성공하면 true를 반환하고, 이미 Set에 존재하는 요소를 추가하려는 경우 false를 반환합니다. |
boolean remove(Object o) | - Set에서 지정된 요소를 제거합니다. - 제거에 성공하면 true를 반환하고, Set에 해당 요소가 존재하지 않는 경우 false를 반환합니다. |
boolean contains(Object o) | - Set에 지정된 요소가 포함되어 있는지 확인합니다. - 포함되어 있다면 true를 반환하고, 포함되어 있지 않다면 false를 반환합니다. |
int size() | - Set에 저장된 요소의 개수를 반환합니다. |
void clear() | - Set에서 모든 요소를 제거합니다. |
boolean hasNext() | 다음 요소가 있으면 true를 반환하고, 없으면 false를 반환 합니다. |
object next() | 다음 요소를 반환합니다. |
void remove() | 다음 요소를 삭제합니다. |
예시코드 그림으로 보기
HashSet<A> set = new HashSet<A>();
A a1 = new A(7,8);
set.add(new A(5,6));
set.add(a1);
Iterator<A> it = set.iterator();
int num = 1;
while(it.hasNext()) {
A a = it.next();
if (a == a1) {
System.out.println(num+"번째에 있습니다.");
}
num++;
}
예제 1>
package mega.backend_onemore.Day28;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
// hasNext로 뒤에 값 있는지 확인하고 next로 넘어가서 다음 요소 반환시킴.
public class SetTest1 {
public static void main(String[] args) {
HashSet<String> a = new HashSet<>();
HashSet<Integer> b = new HashSet<>();
String[] color = {"빨간색","주황색","노란색","초록색","파란색","남색","보라색"};
for(int i = 0;i<color.length;i++) {
a.add(color[i]);
b.add(i);
}
a.add("빨간색"); // 추가적으로 안 들어감, 여기서는 무시됨.
boolean checkChange = a.add("무지개색"); // 잘 들어갔으면 true가 나온다.
System.out.println(checkChange);
System.out.println("b의 가장 큰값은 ? > " + Collections.max(b)); // 6 출력
System.out.println("b의 가장 최소값은 ? > " + Collections.min(b)); // 0 출력
// 얘는 순서가 없기 때문에 이터레이터를 통해 돌려서 출력해야 한다.
Iterator<String> it = a.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
실행 결과
true
b의 가장 큰값은 ? > 6
b의 가장 최소값은 ? > 0
노란색
주황색
남색
파란색
무지개색
초록색
빨간색
보라색
예제 2>
package mega.backend_onemore.Day28;
import java.util.HashSet;
import java.util.Iterator;
class A {
int a;
int b;
A(int a, int b){
this.a = a;
this.b = b;
}
void print() {
System.out.println("a:"+a+",b :"+b);
}
}
public class SetTest2 {
public static void main(String[] args) {
HashSet<A> set = new HashSet<A>();
A a1 = new A(7,8);
set.add(new A(5,6));
/*
set.add(new A(5,6));
set.add(new A(5,6)); 이 두개 쓰는 것은 가능
new를 두 번 불렀기 때문에 객체가 다르므로.
하지만 찾을 때 곤란해지는 상황이 생기지.
*/
set.add(a1);
Iterator<A> it = set.iterator();
int num = 1;
while(it.hasNext()) {
A a =it.next();
if(a == a1) { // 변수로 a1을 빼놨기 때문에 비교 가능
System.out.println(num+"번째에 있습니다.");
// 돌 거니까 1번째, 2번째 등 여러 숫자 중 하나가 나올 수 있음
}
num++;
}
}
}
출력 결과
1번째에 있습니다.
728x90
반응형
'[개발] - Java > Mega' 카테고리의 다른 글
Day28-4. 자료구조 (7) Queue (0) | 2023.04.24 |
---|---|
Day28-3. 자료구조(6) Map (0) | 2023.04.24 |
Day28-29. 파일 입출력 (0) | 2023.04.24 |
Day27-4. 자료구조와 컬렉션 (2) Stack (0) | 2023.04.23 |
Day27-3. 자료구조와 컬렉션 (1) List (0) | 2023.04.23 |
Comments