본문 바로가기

Programming/JAVA

컬렉션 프레임워크(5) - 검색 강화 컬렉션 2 : TreeSet

JAVA logo image

 

 

이제 앞서서 살펴본 기본 이진트리(binary tree)를 기반으로 한 Set 컬렉션인 TreeSet을 살펴보도록 하겠습니다. TreeSet에서 기본적으로 하나의 노드는, 노드 값인 value 그리고 왼쪽/오른쪽 자식 노드 참조를 위한 두 개의 변수로 구성됩니다. 

 

이 TreeSet에 객체를 저장하게 되면 정렬은 자동으로 진행되는데, 이진트리 개념에서 배운 것처럼 부모 값보다 낮은 것은 왼쪽 자식 노드에, 높은 것은 오른쪽 자식 노드에 저장하게 됩니다. 본격적으로 들어가기 앞서 기억이 잘 나지 않는다면 Set 개념도 다시 한번 복습해 보겠습니다. 

 

 

 

컬렉션 프레임워크(3) - Set 컬렉션 1 : Set의 개념

List와 차별화되는 Set 컬렉션의 가장 큰 특징은, 수학의 집합과 유사한 성질을 갖는다는 것입니다. 기본적으로 Set 컬렉션은 인덱스가 사용되는 List와 달리 (1) 순서가 없고, (2) 중복이 허용되지 않

nozeroslope.tistory.com

 

 

 


 

 

 

기본적인 TreeSet 객체 생성 방식에 대해서 알아보겠습니다. 역시 기본 생성자를 호출하게 되는데, 저장 객체 타입을 파라미터로 표시하게 됩니다. 

 

TreeSet<E> treeSet = new TreeSet<E>();
TreeSet<String> treeSet = new TreeSet<String>();

 

 

참고로 그냥 Set타입 변수에 대입해서 사용해도 사용은 가능하지만, TreeSet 클래스 타입으로 대입하는 이유가 있습니다. 바로 객체 검색, 범위 검색과 관련된 메서드를 위해서죠. TreeSet의 메서드를 살펴보겠습니다. 

 

return type method description
E first( ) 제일 낮은 객체를 리턴한다.
E last( ) 제일 높은 객체를 리턴한다.
E lower(E e) 주어진 객체보다 바로 아래 객체를 리턴한다.
E higher(E e) 주어진 객체보다 바로 위의 객체를 리턴한다.
E floor(E e) 주어진 객체와 동등한 객체가 있으면 리턴, 없으면 주어진 객체 바로 아래의 객체를 리턴한다.
E ceiling(E e) 주어진 객체와 동등한 객체가 있으면 리턴, 없으면 주어진 객체 바로 위의 객체를 리턴한다.
E pollFirst( ) 제일 낮은 객체를 꺼내오고 컬렉션에서 제거한다.
E pollLast( ) 제일 높은 객체를 꺼내오고 컬렉션에서 제거한다.

 

 

 


 

 

 

위의 메서드를 설명만 봐서는 잘 이해가 가지 않습니다. 간단한 정수를 다루는 예제를 통해서 사용법을 익혀보겠습니다. 

 

import java.util.TreeSet;

public class ExampleMain {
	public static void main(String[] args) {
		TreeSet<Integer> scores = new TreeSet<Integer>();
		scores.add(new Integer(87));
		scores.add(new Integer(98));
		scores.add(new Integer(75));
		scores.add(new Integer(95));
		scores.add(new Integer(80));
		
		Integer score = null;
		
		score = scores.first();
		System.out.println("최저점수 : " + score);
		
		score = scores.last();
		System.out.println("최고점수 : " + score);
		
		score = scores.lower(new Integer(95));
		System.out.println("95점 바로 아래 점수 : " + score);
		
		score = scores.higher(new Integer(95));
		System.out.println("95점 바로 위 점수 : " + score);
		
		score = scores.floor(new Integer(95));
		System.out.println("95점이거나 바로 아래 점수 : " + score);
		
		score = scores.ceiling(new Integer(85));
		System.out.println("85점이거나 바로 위 점수 : " + score);
		
		while(!scores.isEmpty()) {
			score = scores.pollFirst();
			System.out.println(score + "(남은 객체 수 : " + scores.size() + ")");
		}
		
	}
}

/* 출력
최저점수 : 75
최고점수 : 98
95점 바로 아래 점수 : 87
95점 바로 위 점수 : 98
95점이거나 바로 아래 점수 : 95
85점이거나 바로 위 점수 : 87
75(남은 객체 수 : 4)
80(남은 객체 수 : 3)
87(남은 객체 수 : 2)
95(남은 객체 수 : 1)
98(남은 객체 수 : 0)
*/