[Java] HashSet 사용법

rara_kim·2022년 11월 21일
0

자료구조/알고리즘

목록 보기
10/10

Set(집합)이란?

  • 특정 조건에 맞는 원소들의 모임
  • 자바에서는 Set을 집합이라고 할 수 있다.
  • Set은 중복을 허용하지 않는다.

HashSet 이란?

HashSet은 Set 인터페이스의 구현 클래스이다.
Set은 객체를 중복해서 저장할 수 없고 하나의 Null 값만 저장할 수 있다.

Set 인터페이스를 구현한 클래스로는 HashSet과 TreeSet이 있는데, TreeSet의 경우 HashSet과는 달리 자동정렬 해준다는 차이점이 있다.

Set은 주머니 형태이다. 비선형 구조이기에 저장 순서가 없으며 인덱스도 존재하지 않는다.
그래서 값을 추가하거나 삭제할 때 내가 추가 혹은 삭제하고자 하는 값이 Set 내부에 있는지 검색한 뒤 추가나 삭제를 해야한다. 속도가 List 구조에 비해 느리다.

HashSet 사용법

HashSet 선언

HashSet<Integer> set1 = new HashSet<Integer>();      //HashSet 생성
HashSet<Integer> set1 = new HashSet<Integer>();      //타입 생략 가능
HashSet<Integer> set2 = new HashSet<Integer>(set1);  //set1의 모든 값을 가진 HashSet 생성
HashSet<Integer> set3 = new HashSet<Integer>(Arrays.asList(1, 2, 3, 4, 5,));  //초기값 지정

값의 추가, 삭제

HashSet<Integer> set = new HashSet<>();
set.add(1);     //값 추가
set.remove(1);  //값이 1인 요소 제거

set.add(2);
set.add(3);
set.add(4);
set.clear();    //모든 값 제거

HashSet 크기

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(2, 4, 6, 8, 10));
System.out.println(set.size());      //5

HashSet이 비어있는지 확인

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1, 3, 5, 7, 9,));
System.out.println(set.isEmpty());   //false

HashSet<Integer> set2 = new HashSet<Integer>();
set2.add(1);
set2.remove(1);
System.out.println(set2.isEmpty());  //true

HashSet이 특정값을 가지고 있는지 확인

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1, 2, 3, 4, 5));
System.out.println(set.contains(3));   //true
System.out.println(set.contains(6));   //false

HashSet 값 출력

Set 컬렉션을 그냥 출력할 경우 set의 전체값이 출력된다.
Set은 배열이나 list처럼 인덱스로 객체를 가져오는 get(index)메소드가 없기 때문에, 객체 전체를 대상으로 한번씩 반복해서 가져오는 Iterator를 사용해야 한다.
(Iterator도 따로 import해주어야 한다.)

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(2, 4, 6, 8, 10));
System.out.println(set);     //[2, 4, 6, 8, 10]

Iterator iter = set.iterator();
while(iter.hasNext()) {                    //다음 값이 존재하면 반복
	System.out.print(iter.next() + " ");   //2 4 6 8 10
}

교집합

  • 교집합은 두 집합이 공통으로 포함하는 원소로 이루어진 집합이다.
  • retainAll() 메소드 사용
HashSet a = new HashSet(Arrays.asList(1, 2, 3, 4, 5));
HashSet b = new HashSet(Arrays.asList(2, 4, 6, 8, 10));

a.retainAll(b);                            
System.out.println("교집합: " + a);   //[2, 4] 출력

합집합

  • 합집합은 두 집합 중, 어느 하나에라도 속하는 원소들을 모두 모은 집합이다.
  • addAll() 메소드 사용
HashSet a = new HashSet(Arrays.asList(1, 2, 3, 4, 5));
HashSet b = new HashSet(Arrays.asList(2, 4, 6, 8, 10));

a.addAll(b);
System.out.println("합집합: " + a);   //[2, 4, 6, 8, 10] 출력

차집합

  • 차집합은 두 집합 중, 어느 한 집합에만 속하는 원소들의 집합이다.
  • removeAll() 메소드 사용
HashSet a = new HashSet(Arrays.asList(1, 2, 3, 4, 5));
HashSet b = new HashSet(Arrays.asList(2, 4, 6, 8, 10));

a.removeAll(b);                           
System.out.println("차집합: " + a);   //[1, 3, 5] 출력

여집합

여집합은 전체집합 중 A의 원소가 아닌 것들의 집합이다.

부분집합

  • 다른 집합에 포함된 집합이다.
  • B의 모든 요소가 집합 A의 요소이면 B는 A의 부분집합이라고 한다.
  • containsAll() 메소드 사용
HashSet a = new HashSet(Arrays.asList(1, 2, 3, 4, 5));
HashSet b = new HashSet(Arrays.asList(2, 4));
HashSet c = new HashSet(Arrays.asList(1, 7));

System.out.println(a.containsAll(b));   //true 출력
System.out.println(a.containsAll(c));   //false 출력

HashSet <-> List

List<Integer> list = new ArrayList<>();

Set<Integer> set = new HashSet<>(list);     // list -> set

List<Integer> list = new ArrayList<>(set);  // set -> list 

profile
느리더라도 꾸준하게

0개의 댓글