Java/객체지향

[객체지향][자바의 정석] - 21. TreeSet

얄루몬 2022. 2. 3. 19:46

https://youtu.be/_4EF-26Ke3o?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

https://www.youtube.com/watch?v=Kcz-z6xTbgk&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=131 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


1. TreeSet - 범위 탐색, 정렬

  • 이진 탐색 트리(Binary search tree)로 구현 범위 탐색과 정렬에 유리하다.
  • 이진 트리는 모든 노드가 최대 2개의 하위 노드를 갖는다. (0~2개까지의 하위노드)
  • 각 요소(node)가 나무(tree) 형태로 연결(LinkedList의 변형 - 얘는 1개만 그러나 트리셋은 하위를 2개까지)
  • 부모보다 작은 값은 왼쪽, 큰 값은 오른쪽에 저장
  • 데이터가 많아질 수록, 추가와 삭제에 시간이 더 걸린다(비교 횟수 증가)

TreeSet

 

 

 

2. TreeSet 데이터 저장과정 boolean add(Object o)

- HashSet은 equals( ), hashCode( )로 비교한다.
- TreeSet은 compare( )를 호출해서 비교한다.

 

 

 

3. TreeSet의 주요 메소드

 

 

 

4. 실습

[TreeSet을 만드는 코드]

package javajungsuk;

import java.util.Set;
import java.util.TreeSet;

public class Java11_13 {
	public static void main(String[] args) {
		Set set = new TreeSet(); // 정렬이 따로 필요 없다.
		
		for (int i = 0; set.size()<6 ; i++) {
			int num = (int)(Math.random()*45)+1;
			set.add(num); // set.add(new Integer(num));
		}
		System.out.println(set);
	}
}

 

 

[subSet 사용 코드]

package javajungsuk;

import java.util.TreeSet;

public class Java11_14 {
	public static void main(String[] args) {
		TreeSet set = new TreeSet();
		
		String from ="b";
		String to ="d";
		
		set.add("abc"); set.add("alien"); set.add("bat");
		set.add("car"); set.add("Car"); set.add("disc");
		set.add("dance"); set.add("dZZZZZ"); set.add("dzzzz");
		set.add("elephant"); set.add("elevator"); set.add("fan");
		set.add("flower"); 
		
		System.out.println(set);
		System.out.println("range search : from " + from +" to" + to);
		System.out.println("result1 : "+set.subSet(from, to));
		System.out.println("result2 : "+set.subSet(from, to+"zzz"));
	}
}

 

 

[기준값을 기준으로 큰 값 작은 값을 찾는 코드]

package javajungsuk;

import java.util.TreeSet;

public class Java11_15 {

	public static void main(String[] args) {

		TreeSet set = new TreeSet();
		int[] score = {80,95,50,35,45,65,10,100};
		
		for (int i = 0; i < score.length; i++)
			set.add(new Integer(score[i]));
		
		System.out.println("50보다 작은 값: "+ set.headSet(50));
		System.out.println("50보다 큰 값: " + set.tailSet(50));
		System.out.println("40과 80 사이의 값" + set.subSet(40, 80));
		
	}

}

 

위의 살펴본 예제들은 범위 검색에 유리한 TreeSet의 예시를 보여준 것이다.