[Java] 자바 TreeSet 컬렉션에 대하여 알아보자!

2021-01-16


이번에 TreeMap에 이어서 TreeSet에 대하여 알아보자. 마찬가지로 이진트리구조를 가지고 있는 컬렉션으로써, 이진트리 구조를 잘 모를 경우 전 글을 확인하자.

seeminglyjs.tistory.com/227


사실 Set이라는 자료구조 특성상 Map보다는 훨씬 간단하기 떄문에 바로 코드로 알아보도록 하자.

package tTreeSet;

import java.util.TreeSet;

public class main {

	public static void main(String[] args) {
		TreeSet<Integer> tSet = new TreeSet<>();
		tSet.add(10);
		tSet.add(20);
		tSet.add(30);
		tSet.add(40);
		tSet.add(50);
	}

}

기존 Set 변수를 선언한 방법과 다른점은 앞에 Tree가 붙는다는 점이며, 이외에는 크게 다른 부분은 없다.

 

Tree의 정렬은 디폴트가 오름차순이기 때문에 정렬순서에 따라 첫번째 TreeSet의 값이 최솟값이 되고 마지막 값이 최댓값이 되게 된다. 이와 같은 부분을 코드로 구현해보자. 

package tTreeSet;

import java.util.TreeSet;

public class main {

	public static void main(String[] args) {
		TreeSet<Integer> tSet = new TreeSet<>();
		tSet.add(10);
		tSet.add(20);
		tSet.add(30);
		tSet.add(40);
		tSet.add(50);
		
		Integer max = 0;
		Integer min = 0;
	
		max = tSet.last();
		//가장 큰값 리턴 메서드
		min = tSet.first();
		//가장 작은값 리턴 메서드
		
		System.out.println(max + " " + min);
		
		int temp = tSet.lower(max);
		System.out.println("두번째로 큰 값 = " + temp);
		
		temp = tSet.higher(min);
		System.out.println("두번째로 작은 값 = " + temp);
 	}

}

위와 같인 max / min 변수를 하나씩 선언해주고 이후 tSet에 저장된 값 중 가장 큰 값은 last 메서드로 담아주고, 가장 작은 값은 값은 first 메서드를 활용해서 담아 주었다. 추가적으로 lower와 higher라는 메서드도 같이 구현해봤는데, 해당 메서드는 TreeSet의 특정 인덱스 값을 기준으로 작거나 큰 값을 찾아서 출력할 수 있게 도와 준다. 결과를 콘솔 창에 출력하면 아래와 같다.


TreeMap과 마찬가지로 디폴트 값인 오름차순이 아닌 내림차순으로 출력을 할 수도 있는데, 방법은 아래와 같다.

package tTreeSet;

import java.util.NavigableSet;
import java.util.TreeSet;

public class main {

	public static void main(String[] args) {
		TreeSet<Integer> tSet = new TreeSet<>();
		tSet.add(10);
		tSet.add(20);
		tSet.add(30);
		tSet.add(40);
		tSet.add(50);
        
		NavigableSet<Integer> desc = tSet.descendingSet();
		for(Integer d : desc) {
			System.out.println(d);
		}//내림차순 정렬
        
        	System.out.println("__________________________________________________");		
		NavigableSet<Integer> asc = tSet.descendingSet().descendingSet();
		for(Integer a : asc) {
			System.out.println(a);
		}//오름차순 정렬
        	}

}

descdescendingSet의 경우 리턴값이 NavigableSet이기 때문에 해당 컬렉션으로 다시 한번 감싸 주어야 하며, 이후 for문을 통해 인덱스를 하나씩 받아 담아주면, 디폴트 오름차순이 아닌 내림차순으로 정렬되어 원하는 값이 출력되는 것을 확인할 수 있다. (오름차순은 참고용으로 넣어보았다. 내림차순에 다시 내림차순을 해주면 오름차순이 되게 된다.) 


package tTreeSet;

import java.util.NavigableSet;
import java.util.TreeSet;

public class main {

	public static void main(String[] args) {
		TreeSet<Integer> tSet = new TreeSet<>();
		tSet.add(10);
		tSet.add(20);
		tSet.add(30);
		tSet.add(40);
		tSet.add(50);
		NavigableSet<Integer> sub = tSet.subSet(20, true, 40, true);
		for(Integer s : sub) {
			System.out.println(s);
		}//범위 지정 출력
	}

}

또한 특정 부분한 지정 해서 출력할 수 도 있는데, subSet이라는 메서드를 사용하며 된다. 해당 메서드에 매개변수로는 총 4가지가 들어가는데, 처음부터 ( 시작 객체, 시작 객체 존재 여부, 마지막 객체, 마지막 객체 존재 여부 )로 넣어주면 된다. 예제는 20~40 범위에 있는 수를 모두 출력하기 위해 20과 40도 포함될 수 있도록 둘 다 true값을 주었다.