본문 바로가기
자료구조

Set에 대하여

by 순원이 2024. 4. 16.

Set은 중복을 없애기 위해 사용한다.

Set의 구현체로는 HashSet, LikedHashSet, TreeSet이 있다.

 

HashSet: 순서x, 중복x

LikedHashSet: 순서o, 중복x

TreeSet: 오름차순, 중복x

HashSet<Integer> intHashSet = new HashSet<>();
LinkedHashSet<Integer> intLinkedHashSet = new LinkedHashSet<>();
TreeSet<Integer> intTreeSet = new TreeSet<>();

for (int i : new int[] { 3, 1, 8, 5, 4, 7, 2, 9, 6}) {
	intHashSet.add(i);
	intLinkedHashSet.add(i);
	intTreeSet.add(i);
}


Set<String> strHashSet = new HashSet<>();
Set<String> strLinkedHashSet = new LinkedHashSet<>();
Set<String> strTreeSet = new TreeSet<>();

for (String s : new String[] {
	"Fox", "Banana", "Elephant", "Car", "Apple", "Game", "Dice"
}) {
	strHashSet.add(s);
	strLinkedHashSet.add(s);
	strTreeSet.add(s);
}

for (var s : new Set[] {strHashSet, strLinkedHashSet, strTreeSet}) {
	System.out.println(s);
}


// ⭐ LinkedHashSet : 입력된 순서대로 / TreeSet : 오름차순
// ⚠ HashSet이 정렬된 것처럼 보이지만 보장된 것이 아님
// - Hash 방식에 의한 특정 조건에서의 정렬일 뿐

 

Set 함수

  1. 삽입: Set.add(값);
  2. 제거: Set.remove(값);
  3. 크기: Set.size(); : Set에 크기를 반환한다.
  4. Set에 요소가 있는지 없는지 판단: Set.isEmpty();
    (없으면 True, 있으면 False를 반환)
  5. 지정한 값이 Set 안에 있는지 판단: Set.contains(값);
    (있으면 True, 없으면 False를 반환)

 

 

 

+) Map은 Collection이 아니다.

 removeAll을 보면 파라미터를 Collection을 받는다. 그러면 Collection의 구현체인 HashMap을 파라미터로 넘겨주면 값을 기준으로 삭제하나 키를 기준으로 삭제하나 궁금했다. 그래서 직접 테스트해본 결과 실패했다. 

그동안 Map은 Collectino을 상속받는다 생각했다. 

아니다.

  • Map은 컬렉션이 아니고 컬렉션 역시 Map이 아니다.
  • 맵은 키-값 을 가지고 있고 컬렉션 처럼 키와 값들을 검색하는 메서드들을 하지만 이 것은 “엘리먼트들의 그룹”이라는 컬렉션 인터페이스의 기본 개념과 맞지 않는다.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {

        ArrayList<String> strings = new ArrayList<>();
        strings.add("grape");
        strings.add("apple");
        strings.add("banana");

        LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.addAll(strings);

        TreeSet<String> treeSet = new TreeSet<>();
        treeSet.addAll(strings);

        System.out.println(treeSet);
        System.out.println(linkedHashSet);

        HashMap<String, String> map = new HashMap<>();
        map.put("apple", "apple");

        linkedHashSet.removeAll(map.keySet());      // map의 Key값들
        treeSet.removeAll(map.values());			// map의 Value값들

        System.out.println(treeSet);
        System.out.println(linkedHashSet);
    }
}

'자료구조' 카테고리의 다른 글

HashMap 동작원리  (0) 2024.05.23
Iterator에 대하여  (0) 2024.04.16
Queue에 대해서  (0) 2024.04.15
List <-> 배열 변환하는 법  (1) 2024.03.29
HashMap 사용법  (0) 2024.03.28