💡TreeSet Class
Tree 구조는 이진 트리 구조(이진 탐색 트리, BinarySearch Tree)를 의미하며, Set은 순서가 없고 중복값을 가지지 않음을 의미한다. 그런데 Tree 구조는 정렬이 되어 있다는 특징이 있다.
TreeSet Class는 값을 비교해서 작으면 왼쪽에 방을 만들고, 크면 오른쪽에 방을 만든다. 그래서 들어가는 숫자의 순서에 따라 트리 구조가 이쁘게 만들어질 수도, 안 이쁘게 만들어질 수도 있다.
Hash 알고리즘은 무언가를 찾을 때 굉장히 빠르다. 그래서 HahsSet이 보편적으로 사용하는 Set이지만, 순서가 정렬된 Set이 필요할 때 Tree 구조를 사용한다.
TreeSet 클래스의 활용
TreeSet 배열 생성
HashSet<Integer> set1 = new HashSet<Integer>();
TreeSet<Integer> set2 = new TreeSet<Integer>();
요소 추가하기
set1.add(10);
set1.add(30);
set1.add(40);
set1.add(20);
set1.add(50);
set2.add(10);
set2.add(30);
set2.add(40);
set2.add(20);
set2.add(50);
System.out.println(set1); // [50, 20, 40, 10, 30]
System.out.println(set2); // [10, 20, 30, 40, 50] 자동 오름차순
요소 탐색하기
for (int n : set2) {
System.out.println(n);
}
Iterator<Integer> iter = set2.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
요소를 탐색할 때 다른 배열과 마찬가지로 for과 iterator를 활용할 수 있다.
TreeSet 고유 기능
System.out.println(set2.first());
System.out.println(set2.last());
System.out.println(set2.headSet(30)); // exclusive [10, 20]
System.out.println(set2.tailSet(30)); // inclusive [30, 40, 50]
System.out.println(set2.subSet(20, 40)); // [20, 30]
기본적으로 오름차순 정렬이 되기 때문에 가장 작은 요소와 가장 큰 요소를 출력하는 first(), last() 메소드가 있다. 그러나 중간 요소를 뽑아내는 메소드는 없다.
그리고 기준값을 잡아주면 그것보다 작은 값을 출력해주는 headSet() 메소드, 기준값을 포함해 그보다 큰 값을 출력하는 tailSet() 메소드, 해당 값을 포함해 범위의 숫자를 출력하는 subSet() 메소드가 있다.