-
[JAVA] TreeSetJAVA 2022. 8. 19. 10:48728x90반응형
TreeSet은 이진 탐색 트리(binary search tree)로 구현되어있으며, 범위 탐색과 정렬에 유리합니다.
- 이진 트리의 경우 한개의 노드가 최대 2개의 하위 노드를 갖게 됩니다.
TreeSet의 기본형태 및 특징
부모를 기준으로 작은 값은 왼쪽에 큰 값은 오른쪽에 저장된다.
데이터가 많아 질수록 비교 횟수가 증가하기 때문에 추가, 삭제에 효율성이 떨어진다.
class TreeNode{ TreeNode left; // 왼쪽 자식 노드 Object element; // 저장할 객체 TreeNode right; // 오른쪽 자식 노드 }
데이터의 저장 boolean add(Object o)
- equals()와 hashCode()를 자동으로 호출한다.
- Set은 중복을 허용하지 않는다.
TreeSet의 주요 생성자 및 메서드
TreeSet만 가지고 있는 메서드만 작성했습니다.
- add, remove, size, isEmpty 등은 반복적으로 나왔기 때문에 생략
생성자
- TreeSet() : 기본 생성자
- TreeSet(Collection c) : 주어진 Collection(c)를 저장한 TreeSet 생성
- TreeSet(Comparator comp) : 주어진 정렬기준(comp)으로 정렬하는 TreeSet 생성
그 외
- Object first() : 정렬된 순서에서 첫번째 객체를 반환한다.
- Object last() : 정렬된 순서에서 마지막 객체를 반환한다.
- Object ceiling(Object o) : 지정된 객체(o)와 같은 객체를 반환
- 없으면 지정된 객체(o)보다 큰 값을 가진 객체 중 가장 가까운 값의 객체를 반환한다.
- 큰 값도 없다면 null을 반환한다.
- Object floor(Object o) : 지정된 객체(o)와 같은 객체를 반환
- 없으면 지정된 객체(o)보다 작은 값을 가진 객체 중 가장 가까운 값의 객체를 반환한다.
- 작은 값이 없다면 null을 반환한다.
- Object higher(Object o) : 지정된 객체(o)보다 큰 값을 가진 객체 중 가장 가까운 값의 객체를 반환
- 없다면 null을 반환
- Object lower(Object o) : 지정된 객체(o)보다 작은 값을 가진 객체 중 가장 가까운 값의 객체를 반환
- 없다면 null을 반환
- SortedSet subSet(Object fromElement, Object toElement)
- 지정된 범위 (fromElement <= x < toElement)의 결과를 반환한다.
- SortedSet headSet(Object toElement) : 지정된 객체(toElement)보다 작은 값의 모든 객체를 반환한다.
- SortedSet tailSet(Object fromElement) : 지정된 객체(fromElement)보다 큰 값의 모든 객체를 반환한다.
예제를 통해 알아보기
import java.util.*; public class MyClass { public static void main(String args[]) { Set set = new TreeSet(); // 정렬이 필요없다. TreeSet은 내부적으로 정렬을 한다. for (int i = 0; set.size() < 6; i++){ int num = (int)(Math.random()*45) + 1; set.add(num); } System.out.println(set); //================================================================================================== // 위에 코드를 HashSet으로 만든다면? Set ex = new HashSet(); for(int i = 0; ex.size() < 6; i++){ int num = (int)(Math.random()*45)+1; ex.add(num); } List list = new LinkedList(ex); // LinkedList(Collection c) // Set은 순서가 없기때문에 정렬을 할 수 없다. // Set을 순서가 있는 List로 형 변환 후 정렬해줘야한다. Collections.sort(list); System.out.println("HashSet으로 만든 것 = "+list); //================================================================================================== // 저장할 객체와 정렬기준을 따로따로 만들었을때 Set set2 = new TreeSet(new TestComp()); // 정렬기준을 정해준 TreeSet 생성 set2.add(new TestTreeSet()); // 6504e3b2 set2.add(new TestTreeSet()); // 515f550a set2.add(new TestTreeSet()); // 6504e3b2 System.out.println(set2); // TestComp의 리턴값이 1 이면 >> [TestTreeSet@6504e3b2, TestTreeSet@515f550a, TestTreeSet@6504e3b2] // TestComp의 리턴갑이 -1 이면 >> [TestTreeSet@6504e3b2, TestTreeSet@515f550a, TestTreeSet@6504e3b2] // TestComp의 리턴값이 0 이면 >> [TestTreeSet@6504e3b2] // 저장할 객체에게 정렬기준까지 부여했을때 Set set3 = new TreeSet(); set3.add(new AllComp()); // 626b2d4a set3.add(new AllComp()); // 5e91993f set3.add(new AllComp()); // 1c4af82c System.out.println(set3); // AllComp의 리턴값이 1이면 >> [AllComp@626b2d4a, AllComp@5e91993f, AllComp@1c4af82c] // AllComp의 리턴값이 -1이면 >> [AllComp@626b2d4a, AllComp@5e91993f, AllComp@1c4af82c] // AllComp의 리턴값이 0이면 >> [AllComp@626b2d4a] TreeSet set4 = new TreeSet(); String from = "b"; String to = "d"; set4.add("abc"); set4.add("alien"); set4.add("bat"); set4.add("car"); set4.add("Car"); set4.add("disc"); set4.add("dance"); set4.add("dZZZZ"); set4.add("dzzzz"); set4.add("elephant"); set4.add("elevator"); set4.add("fan"); set4.add("flower"); System.out.println(set4); // TreeSet이 내부적으로 자동 정렬을 해준다. ( 소문자 보단 대문자가 앞에 온다. ) // [Car, abc, alien, bat, car, dZZZZ, dance, disc, dzzzz, elephant, elevator, fan, flower] System.out.println("range search : from " + from + " to " + to); System.out.println("result 1 = " + set4.subSet(from, to)); // result 1 = [bat, car] System.out.println("result 2 = " + set4.subSet(from, to+"zzz")); // result 2 zzz= [bat, car, dZZZZ, dance, disc] System.out.println("result 3 = " + set4.subSet(from, to+"pp")); // result 3 pp= [bat, car, dZZZZ, dance, disc] System.out.println("result 4 = " + set4.subSet(from, to+"dd")); // result 4 dd= [bat, car, dZZZZ, dance] System.out.println("result 5 = " + set4.subSet(from, to+"et")); // result 5 et= [bat, car, dZZZZ, dance] TreeSet set5 = new TreeSet(); int[] score = {80,90,50,35,45,65,10,100}; for(int i = 0; i < score.length; i++){ set5.add(new Integer(score[i])); } System.out.println("50보다 작은 수 = " + set5.headSet(new Integer(50))); // 50보다 작은 수 = [10, 35, 45] System.out.println("50보다 큰 수 = " + set5.tailSet(new Integer(50))); // 50보다 큰 수 = [50, 65, 80, 90, 100] System.out.println("40 <= x < 80 = " + set5.subSet(40,80)); // 40 <= x < 80 = [45, 50, 65] } } class TestTreeSet{} class TestComp implements Comparator{ // Comparator은 두 객체를 비교한다. public int compare(Object o1, Object o2){ // 원래는 여기에 비교내용을 적어준다. return 0; // 0 = 같다, 1 = o2, -1 = o1 } } class AllComp implements Comparable{ // Comparable은 자기자신과 객체 하나를 비교한다. public int compareTo(Object o1){ // 원래는 여기에 비교내용을 적어준다. return 0; } }
728x90반응형'JAVA' 카테고리의 다른 글
Java 객체지향 공부 다형성, interface, 상속, 포함 등 (0) 2022.08.22 [JAVA] Map 관련 내용 (0) 2022.08.19 [JAVA] HashSet (0) 2022.08.18 [JAVA] Iterator Method 관련 내용 (0) 2022.08.18 [JAVA] Collection Framework 정리 (0) 2022.08.17