Set

BuZZLightyear·2023년 3월 6일
0

정리

목록 보기
31/47

Set

요소의 중복을 허용하지 않고, 저장 순서를 유지하지 않는 컬렉션
대표적인 Set을 구현한 클래스 HashSet, TreeSet 이 있음

Set 인터페이스에 정의된 메서드

HashSet

중복된 값을 허용하지 않으며, 저장 순서를 유지하지 않는다.

HashSet에 값을 추가할 때, 해당 값이 중복된 값인지 판단하는 법
1. add(Object o)를 통해 객체를 저장
2. 이 때, 저장하고자 하는 객체의 해시코드를 hashCode() 메서드를 통해 얻어냄
3. Set이 저장하고 있는 모든 객체들의 해시코드를 hashCode() 메서드로 얻어냄
4. 저장하고자 하는 객체의 해시코드와, Set에 이미 저장되어져 있던 객체들의 해시코드를 비교하여, 같은 해시코드가 있는지 검사

  • 이 때, 만약 같은 해시코드를 가진 객체가 존재한다면 아래의 5번으로 넘어감
  • 같은 해시코드를 가진 객체가 존재하지 않는다면, Set에 객체가 추가되며 add(Object o) 메서드가 true를 리턴
  1. equals() 메서드를 통해 객체를 비교
  • true가 리턴된다면 중복 객체로 간주되어 Set에 추가되지 않으며, add(Object o)가 false를 리턴
  • false가 리턴된다면 Set에 객체가 추가되며, add(Object o) 메서드가 true를 리턴
 public static void main(String[] args) throws IOException {

        // HashSet 생성
        HashSet<String > languages = new HashSet<String>();

        // HashSet에 객체 추가
        languages.add("Java");
        languages.add("Python");
        languages.add("Javascript");
        languages.add("C++");
        languages.add("Kotlin");
        languages.add("Ruby");
        languages.add("Java"); // 중복

        // 반복자 생성하여 it에 할당
        Iterator it = languages.iterator();

        // 반복자를 통해 HashSet을 순회하며 각 요소들을 출력
        while(it.hasNext()) {
            System.out.println(it.next());
        }


    }

Java
C++
Javascript
Ruby
Python
Kotlin

Java가 중복 입력됬지만 출력은 한번만 됨

TreeSet

이진 탐색 트리 형태로 데이터를 저장
데이터의 중복 저장을 허용하지 않고 저장 순서를 유지하지 않는 Set 인터페이스의 특징은 그대로 유지

이진 탐색 트리 : 하나의 부모 노드가 최대 두 개의 자식 노드와 연결되는 이진 트리(Binary Tree)의 일종으로, 정렬과 검색에 특화된 자료 구조
이때 최상위 노드를 ‘루트'라고 함. 아래 그림에서 10이 바로 루트 노드에 해당됨
이진 탐색 트리는 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징

class Node {
	Object element; // 객체의 주소값을 저장하는 참조변수 입니다. 
	Node left;      // 왼쪽 자식 노드의 주소값을 저장하는 참조변수입니다.
	Node right;     // 오른쪽 자식 노드의 주소값을 저장하는 참조변수입니다. 
}
    public static void main(String[] args) throws IOException {

        // TreeSet 생성
        TreeSet<String> workers = new TreeSet<>();

        // TreeSet에 요소 추가
        workers.add("Lee Java");
        workers.add("Park Hacker");
        workers.add("Kim Coding");

        System.out.println(workers);
        System.out.println(workers.first());
        System.out.println(workers.last());
        System.out.println(workers.higher("Lee"));
        System.out.println(workers.subSet("Kim", "Park"));
    }
[Kim Coding, Lee Java, Park Hacker]
Kim Coding
Park Hacker
Lee Java
[Kim Coding, Lee Java]

요소를 추가하기만 했음에도 불구하고, 자동으로 사전 편찬 순에 따라 오름차순으로 정렬된 것을 확인할 수 있다. 이는 TreeSet의 기본 정렬 방식이 오름차순이기 때문이다.

profile
버즈라이트이어

0개의 댓글