Set 자료구조: 중복을 허용하지 않고 순서가 보장되지 않는 자료구조
자바의Set인터페이스는java.util패키지의 컬렉션 프레임워크에 속하는 인터페이스 중 하나이다.Set인터페이스는중복을허용하지않는유일한요소의집합을나타낸다. 즉,어떤요소도같은Set내에두번이상나타날수없 다.Set은 수학적 집합 개념을 구현한 것으로, 순서를 보장하지 않으며, 특정 요소가 집합에 있는지 여부를 확인하는 데 최적화되어 있다.
- hash 자료구조 이용
- 순서없이 저장
- O(1)의 시간복잡도
- 용도: 데이터의 유일성이 중요할 때 사용
ex:
data가 1,2,5,8,14,99가 입력 -->hashIndex(): data % capacity --> 이 연산을 통한 hashIndex를 배열의 index로 사용
- HashSet에 연결리스트 추가
- 추가된 순서대로 저장
- O(1)의 시간복잡도
- 용도: 데이터 유일성(Hash)을 중요시하는 동시에 삽입된 순서를 유지
ex:
- HashSet과 동일하지만 삽입 순서대로 노드가 연결되어 있음
- 자식이 2개까지 올 수 있다: 이진트리
- Node의 왼쪽이 작은 값, 오른쪽이 큰 값: 이진 탐색 트리
트리구조 구현
DoublyLinkedList와 같이prev -> left, next-> right를 가진 자료구조이다. 각Node.left와Node.right는 자식 노드의 참조값을 가진다.
Integer[] inputArr = {30,20,20,10,10}; //다음 정수들이 입력됨, 중복 값을 제거하고 값을 출력하기(출력 순서는 관계X) //HashSet Set<Integer> set = new HashSet<>(); for(Integer s : inputArr){ set.add(s); } for(Integer s : set){ System.out.println(s); }
- HashSet을 사용하면 중복 데이터 저장 X
- 단순히 HashSet에 값 입력 후 HashSet 출력
- HashSet 순서를 보장X
Integer[] inputArr = {30,20,20,10,10}; //다음 정수들이 입력됨, 중복 값을 제거하고 값을 출력하기(입력순서대로 출력!) //LinkedHashSet Set<Integer> set = new LinkedHashSet<>(List.of(inputArr)); for(Integer s : set){ System.out.println(s); }
- 입력 순서대로 출력하기 위해
LinkedHashSet사용- 배열을
Set에 입력할 때 직접 배열을 반복하며 입력해도 괜찮지만 배열을List로 변환해 전달할 수 있다.//배열을 리스트로 변환하기 List<Integer> list = Arrays.asList(inputArr); List<Integer> list = List.of(inputArr); //편리한 리스트 생성 List<Integer> list = Arrays.asList(1,2,3); List<Integer> list = List.of(1,2,3);
Integer[] inputArr = {30,20,20,10,10}; //다음 정수들이 입력됨, 중복 값을 제거하고 값을 출력하기(데이터의 값 순서대로) //TreeSet TreeSet<Integer> tree = new TreeSet<>(); for(Integer s : inputArr){ tree.add(s); } for(Integer s : tree){ System.out.println(s); }
- 데이터의 값 순서대로 출력하려면 TreeSet사용