Java

[Java] Collection Set 정리하기

openDeveloper 2023. 3. 29. 07:12

 Java에서는 다양한 데이터 구조를 지원하기 위해 Collection 인터페이스를 제공합니다. Collection 인터페이스는 List, Set, Queue 인터페이스를 상속받고 있습니다.

 

https://gangnam-americano.tistory.com/41

Java에서 Set은 Collection 인터페이스를 구현한 것으로, 중복된 원소를 허용하지 않으며 순서가 없는 데이터 구조입니다. Java에서 Set은 HashSet, TreeSet, LinkedHashSet 등의 구현체가 있습니다.

HashSet은 가장 기본적인 Set 구현체로, 해시 테이블을 이용하여 원소를 저장합니다. HashSet은 중복된 원소를 허용하지 않으며 순서가 보장되지 않습니다.

TreeSet은 이진 검색 트리(binary search tree)를 이용하여 원소를 저장합니다. TreeSet은 원소를 정렬된 순서로 저장하므로, 순서가 보장됩니다. 또한, HashSet보다 삽입, 삭제, 검색 등의 연산이 느립니다.

LinkedHashSet은 해시 테이블과 연결 리스트를 이용하여 원소를 저장합니다. HashSet과 비슷하지만 원소가 삽입된 순서를 기억하여, 순서가 보장됩니다.

Set은 원소의 중복을 허용하지 않으므로, 원소를 추가하기 전에 contains 메서드로 이미 존재하는 원소인지 검사해야 합니다. 또한, Set은 Collection 인터페이스를 상속받으므로, Collection 인터페이스가 제공하는 다양한 메서드들을 사용할 수 있습니다.

 

HashSet 구현 예시

 

import java.util.HashSet;
import java.util.Set;

public class Example {
    public static void main(String[] args) {
        // HashSet 생성 및 선언
        Set<String> hashSet = new HashSet<String>();

        // HashSet에 데이터 추가
        hashSet.add("apple");
        hashSet.add("banana");
        hashSet.add("orange");

        // HashSet에 있는 데이터 출력
        for (String str : hashSet) {
            System.out.println(str);
        }
    }
}

 

TreeSet 구현 예시

 

import java.util.Set;
import java.util.TreeSet;

public class Example {
    public static void main(String[] args) {
        // TreeSet 생성 및 선언
        Set<String> treeSet = new TreeSet<String>();

        // TreeSet에 데이터 추가
        treeSet.add("apple");
        treeSet.add("banana");
        treeSet.add("orange");

        // TreeSet에 있는 데이터 출력
        for (String str : treeSet) {
            System.out.println(str);
        }
    }
}

 

LinkedHashSet 구현 예시

 

import java.util.LinkedHashSet;
import java.util.Set;

public class Example {
    public static void main(String[] args) {
        // LinkedHashSet 생성 및 선언
        Set<String> linkedHashSet = new LinkedHashSet<String>();

        // LinkedHashSet에 데이터 추가
        linkedHashSet.add("apple");
        linkedHashSet.add("banana");
        linkedHashSet.add("orange");

        // LinkedHashSet에 있는 데이터 출력
        for (String str : linkedHashSet) {
            System.out.println(str);
        }
    }
}

 

+ SortedSet 구현

 SortedSet은 Set 인터페이스를 상속받아 정렬된 순서로 데이터를 저장하는 데이터 구조입니다. SortedSet은 중복된 원소를 허용하지 않으며, 각 원소들은 Comparable 또는 Comparator를 구현하여 정렬 순서를 결정합니다.

 

import java.util.SortedSet;
import java.util.TreeSet;

public class Example {
    public static void main(String[] args) {
        // TreeSet 생성 및 선언
        SortedSet<String> sortedSet = new TreeSet<String>();

        // SortedSet에 데이터 추가
        sortedSet.add("banana");
        sortedSet.add("apple");
        sortedSet.add("orange");

        // SortedSet에 있는 데이터 출력
        for (String str : sortedSet) {
            System.out.println(str);
        }
    }
}

 

 SortedSet은 Comparable 또는 Comparator를 구현하여 정렬 순서를 결정할 수 있습니다. 예를 들어, 다음과 같이 Comparator를 이용하여 역순으로 정렬할 수 있습니다.

 

import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;

public class Example {
    public static void main(String[] args) {
        // Comparator 생성
        Comparator<String> comp = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);
            }
        };

        // TreeSet 생성 및 선언
        SortedSet<String> sortedSet = new TreeSet<String>(comp);

        // SortedSet에 데이터 추가
        sortedSet.add("banana");
        sortedSet.add("apple");
        sortedSet.add("orange");

        // SortedSet에 있는 데이터 출력
        for (String str : sortedSet) {
            System.out.println(str);
        }
    }
}

 

 따라서 Set 인터페이스에서 제공하는 메소드는 다음과 같습니다.

add(E e): Set에 원소를 추가합니다. 중복된 원소는 추가되지 않습니다.
remove(Object o): Set에서 해당하는 원소를 삭제합니다. 원소가 삭제되면 true를 반환하며, 원소가 없으면 false를 반환합니다.
contains(Object o): Set에 해당하는 원소가 있는지 검사합니다. 있으면 true를 반환하며, 없으면 false를 반환합니다.
isEmpty(): Set이 비어있는지 검사합니다. 비어있으면 true를 반환하며, 비어있지 않으면 false를 반환합니다.
size(): Set에 저장된 원소의 개수를 반환합니다.
clear(): Set의 모든 원소를 삭제합니다.
iterator(): Set에 저장된 원소를 순회할 수 있는 반복자(iterator)를 반환합니다

 

iterator() 예시

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Example {
    public static void main(String[] args) {
        // HashSet 생성 및 선언
        Set<String> hashSet = new HashSet<String>();

        // HashSet에 데이터 추가
        hashSet.add("apple");
        hashSet.add("banana");
        hashSet.add("orange");

        // iterator() 메소드를 이용하여 Set에 저장된 원소를 출력
        Iterator<String> iterator = hashSet.iterator();
        while (iterator.hasNext()) {
            String str = iterator.next();
            System.out.println(str);
        }
    }
}

 iterator() 메소드는 Set에 저장된 원소를 순회하는 Iterator 객체를 반환합니다. Iterator 객체를 이용하여 Set에 저장된 원소를 hasNext() 메소드로 검사하고, next() 메소드로 원소를 반환합니다. Set에 저장된 모든 원소를 순회할 때까지 while문을 이용하여 순회합니다.

 

SortedSet 인터페이스를 상속받기 때문에, SortedSet 인터페이스에서 제공하는 메소드들을 사용할 수도 있습니다. 이 메소드들은 Set의 원소를 정렬된 순서로 다룰 수 있는 메소드들입니다. 일부 SortedSet 인터페이스에서 제공하는 메소드들은 다음과 같습니다.

first(): SortedSet에서 가장 작은 원소를 반환합니다.
last(): SortedSet에서 가장 큰 원소를 반환합니다.
headSet(E toElement): SortedSet에서 toElement 이전의 원소들로 구성된 부분집합을 반환합니다.
tailSet(E fromElement): SortedSet에서 fromElement 이후의 원소들로 구성된 부분집합을 반환합니다.
subSet(E fromElement, E toElement): SortedSet에서 fromElement와 toElement 사이의 원소들로 구성된 부분집합을 반환합니다. fromElement와 toElement는 포함됩니다.