카테고리 없음
셋
백엔드 개발자
2024. 7. 13. 12:18
- 중복되지 않는 요소들의 집합
주요 클래스 | 장점 | 단점 |
HashSet | 성능이 빠르고 메모리 적게 사용 | 순서 관련 기능 없음 (보장하지 않음) |
LinkedHashSet | 요소들을 입력 순서대로 정렬 (내부적으로 링크 사용) | HashSet보다는 성능 떨어짐 |
TreeSet | 요소들을 특정 기준대로 정렬 (기본 오름차순) | 데이터 추가/삭제에 시간 더 소모 |
HashSet
- 중복 add는 처리되지 않는다. intHset1에는 1,2,3만 들어가 있다.
- ints1은 ArrayList로 10개의 요소를 가지고 있지만, 이를 Set으로 변환시키면 중복이 제거되어 7개의 요소만 남는 것을 볼 수 있다.
// 💡 for-each문 사용 가능
for (Integer i :intHSet1) {
System.out.println(i);
}
셋을 사용해서 중복제거된 리스트
- Set으로 변환한 다음 리스트를 초기화한다. 그리고 addAll로 Set을 리스트에 넣는 방식.
해시 ( 해시셋이 이용하는 방식)
- 내부적으로 16개까지는 정렬이 되는 것처럼 보이나, 그 이후에는 재조정 되니 정렬 목적으로는 사용하지 말자.
해시 셋의 메서드
// 포함 여부
boolean has2 = intHSet1.contains(2);
boolean has4 = intHSet1.contains(4);
// 요소 삭제, 있었는지 여부 반환
boolean rm3 = intHSet1.remove(3);
boolean rm4 = intHSet1.remove(4);
- contains : intHSet1에 2라는 요소가 있는지 여부를 boolean값으로 반환.
- remove : contains에서 요소를 삭제하는 부분만 추가됨.
// 다른 콜렉션 기준으로 내용 삭제
intHSet2.removeAll(intHSet1);
// 💡 그 외 size, isEmpty, clear, clone 등의 메소드들 확인
- intHSet2의 요소들 중 intHSet1과 겹치는 요소들을 전부 제거 하는 메서드.
참조형 관련
- 참조형은 인스턴스의 참조가 다르면 새로운 객체로 인식하기 때문에, 맨처음 생성해놓은 swordman이외에 새인스턴스로 넣은 2개까지 총 3개가 들어간다.
- 인스턴스 요소를 지우려면 동일한 참조값으로 지워야 하는데, 인스턴스를 생성해서 바로 넣은 경우에는 인스턴스 주소가 없으니 clear로만 제거해야 한다.
HashSet, LinkedHashSet, TreeSet 방식 비교
- LinkedHashSet은 입력된 순서대로 들어가는걸 볼 수 있고, TreeSet은 오름차순으로 정렬되는 걸 볼 수 있다.
- HashSet은 순서가 보장되는 것처럼 보이지만, 16개 이상부터는 재조정되서 정렬이 보장되지는 않는다.
문자열로 정렬해볼 경우
- HashSet은 숫자가 아니니 정렬이 바로 보장 안되는 것을 볼 수 있었다.
- LinkedHashSet은 그대로 숫자처럼 입력순서대로 정렬되는 것을 볼 수 있다.
- TreeSet은 알파뱃 순서대로 정렬된다.
Red-Black Tree
TreeSet에 사용되는 알고리즘
한 요소를 기준으로 작은 값과 큰값 이분해서 정렬되므로, 검색시에 LinkedHashSet보다 속도가 빠르다.
요소 추가/제거 시에는 과정이 복잡하여 메모리나 시간이 더 소요된다.
// 💡 TreeSet의 주요 메소드들
int firstInt = intTreeSet.first();
String lastStr = strTreeSet.last();
- last() 메서드의 경우 Set<String> strTreeSet = new TreeSet<>() 이런식으로 선언하는게 아니라
TreeSet<String> strTreeSet = new TreeSet<>(); 맨앞 받아주는 자료형도 TreeSet으로 선언해야 에러가 나지 않는다고 한다. - 가장 맨앞의 작은값, 맨뒤의 큰값을 출력해준다.(first, last)
// 같은 것이 없다면 트리구조상 바로 위의 것 (바로 더 큰 것) 반환
String foxCeiling = strTreeSet.ceiling("Fox");
String creamCeiling = strTreeSet.ceiling("Cream");
// 같은 것이 없다면 트리구조상 바로 아래의 것 (바로 더 작은 것) 반환
String foxFloor = strTreeSet.floor("Fox");
String diceFloor = strTreeSet.floor("Cream");
- 같은 것이 없으면 바로 위의 것을 반환하는 ceiling
- 같은 것이 없으면 바로 아래의 것을 반환하는 floor
// 맨 앞에서/뒤에서 제거
int pollFirst1 = intTreeSet.pollFirst();
int pollFirst2 = intTreeSet.pollFirst();
int pollLast1 = intTreeSet.pollLast();
int pollLast2 = intTreeSet.pollLast();
// 순서가 뒤집힌 NavigableSet 반환
Set<String> strTreeSetDesc
= (TreeSet<String>) strTreeSet.descendingSet();
- 순서가 거꾸로 뒤집혀있는 Set 반환하는 descendingSet
// ⚠️ 요소로 추가 불가
// - 이후 배울 Comparable 또는 Comparator 필요
TreeSet<Knight> knightSet1 = new TreeSet<>();
knightSet1.add(new Knight(Side.BLUE));
knightSet1.add(new Knight(Side.BLUE));
knightSet1.add(new Knight(Side.BLUE));
- 같은 Knight 요소끼리 비교할 수 있는 기준이 없어서 요소로 추가가 불가능한 상황.
- TreeSet을 사용하려면 요소끼리 비교할 수 있는 방법이 있어야 한다.
출처
제대로 파는 자바 (Java) - by 얄코 강의 | 얄팍한 코딩사전 - 인프런
얄팍한 코딩사전 | 적당히 배워서는 살아남을 수 없는 시대. 자바, 한 번에 제대로 파서 마스터하세요!, 자바(Java), 생기초부터 활용까지 강의 하나로 한번에 끝! 🎓 대학교 이메일 계정이 있다
www.inflearn.com