코드 그라데이션

Day28-2. 자료구조(5) Set 본문

Java/Mega

Day28-2. 자료구조(5) Set

완벽한 장면 2023. 4. 24. 21:25

Set

: 중복된 값을 저장하지 않는 집합(Set) 자료구조의 기능을 정의하는 인터페이스.

-  Set은 순서에 상관없이 요소를 저장하며, 중복된 값을 허용하지 않음.

 

- 대표적인 클래스로는 HashSet, TreeSet, LinkedHashSet이 있음.

HashSet

: 해시 테이블(hash table)을 구현한 클래스, 가장 빠른 검색 속도를 제공.

- 순서를 보장하지 않지만, 중복된 값을 허용하지 않음

TreeSet

: 이진 검색 트리(binary search tree)를 구현한 클래스로, 요소를 자동으로 정렬함.

- TreeSet은 검색 속도가 빠르지만, HashSet보다는 느리다.

LinkedHashSet

: LinkedHashSet은 해시 테이블과 연결 리스트(linked list)를 결합한 클래스.

- 요소를 삽입한 순서대로 저장.

- LinkedHashSetHashSet과 비슷한 검색 속도를 제공하면서 순서를 보장한다

- 주로 이터레이터(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() 다음 요소를 삭제합니다.

 

 

 

Set의 연결 구조

 

예시코드  그림으로 보기

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 = 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