[Java] Set - 집합

HAEIL·2024년 1월 28일

JAVA

목록 보기
3/8

Set 자료형

Set 또한 Map과 같이 처음에

import java.util.HashSet;

으로 시작한다. HashSet 말고도 TreeSet, LinkedHashSet 등이 있다.

import java.util.Arrays;
import java.util.HashSet;

public class Sample {
	public static void main(String[] args) {
    	HashSet<String> set = new HashSet<>(Arrays.asList("H", "e", "l", "l", "o"));
        System.out.println(set); // [e, h, l, o] 출력

집합과 관련된 메소드

set 자료형의 경우에는 아래와 같은 특징이 있다.

1. 순서가 없다.
2. 중복을 허용하지 않는다.
3. 진짜 말 그대로 집합임. 옛날에 수학시간에 배운 집합 = Set ==> 교집합/합집합 등에 쓰임

retainAll(set); 교집합

import java.util.Arrays;
import java.util.HashSet;

publbic class Sample {
	public static void main(String[] args) {
    	HashSet<Integer> s1 = new HashSet<>(Ararys.asList(1, 2, 3, 4, 5, 6));
        HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));
        
        HashSet<Integer> intersection = new HashSet<>(s1); // s1으로 intersection 생성  --> 생성할 때 arguments로 HashSet 자료형을 넣으면 그대로 들어간다 ! !
        intersection.retainAll(s2); // s1 교집합 s2
        System.out.println(intersection); // [4,5,6] 출력
    }
}

addAll(set); 합집합

union.addAll(s2); // 합집합 수행 [1,2,3,4,5,6,7,8,9]

removeAll(set); 차집합

substract.removeAll(s2); // 차집합 수행 [1,2,3,]

차집합은 순서에 따라 결과가 달라질 수 있음 #주의#

Set 자료형의 메소드

add(값);

HashSet<Integer> set = new HashSet<>();
set.add("값1"); // 정수로 선언해서 오류남
set.add(1); // 가능
set.add(2); // 가능

addAll(값1, 값2,,,);

HashSet<Integer> set = new HashSet<>();
set.addAll(1, 2, 3, 4); // [1,2,3,4]  

합집합을 구할 때도 addAll(set);
--> 리스트를 넣어도 되나? 아래 테스트해보니 가능하다.

import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;

public class Main {
    public static void main(String[] args) {
        LinkedList<Integer> lists = new LinkedList<>(Arrays.asList(3, 5, 4));
//        HashSet<Integer> hashh = new HashSet<>(lists);
//        hashh.addAll(lists);
//위 두가지 방법은 모두 같은 결과를 출력한다.
        System.out.println(hashh);
    }
}

remove(값);

HashSet<String> set = new HashSet<>(Arrays.asList("Jump", "To", "Java"));
set.remove("To");
System.out.println(set);  // [Java, Jump] 출력

하나씩 삭제할 때 해당 값을 작성하면 메모리(공간)도 삭제시켜주나봄..
이것이 garbage collector?

TreeSet, LinkedHashSet도 있다.

TreeSet과 LinkedHashSet
집합 자료형의 특징은 순서가 없다는 것이다. 그런데 집합에 입력한 순서대로 데이터를 가져오거나 오름차순으로 정렬된 데이터를 가져오고 싶을 수 있다. 이럴 때는 TreeSet과 LinkedHashSet을 사용하자.

TreeSet : 값을 오름차순으로 정렬해 저장한다.
LinkedHashSet : 값을 입력한 순서대로 정렬한다.

출처: 점프 투 자바 wikidocs

List vs Set vs Map

List와 Set, Map은 비슷한 점이 있다.
정리 참고 : https://xzio.tistory.com/1828

List

- 순서가 있고, 중복을 허용한다. like 배열
- 가변적인 배열 - 값을 추가하면 크기가 알아서 커짐
- 원하는 데이터가 뒤쪽에 위치하는 경우, 앞에서부터 순차적으로 탐색해 속도의 문제가 발생한다.

Set

- 집합 (= 중복된 데이터 X), 순서가 없다.
- 순서가 없고, 중복을 허용하지 않는다.
- 속도가 빠르다.

Map

- Collection과는 다른 별개의 자료형.
- 키-밸류로 이루어짐
- 빠른 속도.

Iterator

Java의 자료형은 Collection 인터페이스 속에 모두 모여있음.
즉, List, Set은 Iteratior라는 인터페이스를 활용 가능하다.
(사실 Map도 가능하다. --> HashMap 구조에서 키 값을 iterator 클래스를 이용해 순서대로 저장해두면 이를 통해서 순서대로 데이터 추출 가능)

Iterator에는 3개의 메소드가 있다.(더 있나?)

boolean hasNext(); // 다음 요소가 있으면 true, 없으면 false 리턴
E next(); // 이터레이션의 다음 요소 리턴
default void remove(); // 삭제

예시)

import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;

public class Main {
    public static void main(String[] args) {
        LinkedList<Integer> lists = new LinkedList<>(Arrays.asList(3, 5, 4));
        Iterator<Integer> iter = lists.iterator();
//위 링크드리스트의 제너릭스에 맞춰서 Iterator 제너릭스 작성!! 
        while(iter.hasNext()) {
            System.out.println(iter.next()); // 3 5 4 출력
        }
    }
}
profile
컴퓨터공학과를 졸업할 동안 개발을 소홀히 하다가 이제는 진짜 해야겠다 싶어서 시작한 블로그. 사족을 담아 최대한 이해하기 쉽게 작성하다보니 실제 전문가가 보기엔 틀린 점이 있을 수 있다...

0개의 댓글