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

2021-01-14


TreeMap에서는 Tree라는 개념이 중요하다. 이는 이진트리 구조를 뜻하는데, 아래 보이는 노드들이 바로 이진트리 형태의 구조이다.

맨 위의 시작 노드를 보통 루트(root)라고 불리며, 나머지는 n개의 자식 노드들로 구성되어 있다. (하위 노드 위에 루트 노드를 제외한 인접한 상위 노드가 있다면 그 상위 노드를 부모 노드라고 부르기도 한다.) 해당 구조를 자세히 보면 같은 자식이라도 왼쪽은 작은 자식 오른쪽은 큰 자식이라고 된 것을 볼 수 있는데, 이는 마찬가지로 아래 이진트리를 보면 이해가 쉬울 것이다.

부모(상위) 노드를 기준으로 큰 값은 우측 작은 값은 좌측에 저장된다. 자 이제 tree 구조 설명을 됐으니 TreeMap을 살펴보자.


TreeMap의 가장 큰 장점은 객체를 저장하면 자동으로 정렬이 된다는 점이다!(개꿀) 

package tTreeMap;

import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;
import java.util.TreeMap;

public class main {

	public static void main(String[] args) {
		TreeMap<Integer, String> tMap = new TreeMap<Integer, String>();
		
		tMap.put(5, "fff");
		tMap.put(3, "bbb");
		tMap.put(2, "ccc");
		tMap.put(7, "ddd");
		tMap.put(1, "aaa");
	}

}

map 자료구조 특징상 key값과 value 값을 제네릭 타입으로 넣어주어야한다. 우선 key는 Integer  / value는 String을 주었다. 다음 put 메서드를 통해 순서 상관없이 데이터를 입력해 주었다.

 

ThreeMap을 키값에 따라 오름차순으로 자동정렬되며, 우선 가장 첫 번째 값과(가장 작은 key) 마지막 값(가장 큰 key)을 출력해보자.

package tTreeMap;

import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;
import java.util.TreeMap;

public class main {

	public static void main(String[] args) {
		TreeMap<Integer, String> tMap = new TreeMap<Integer, String>();
		
		tMap.put(5, "fff");
		tMap.put(3, "bbb");
		tMap.put(2, "ccc");
		tMap.put(7, "ddd");
		tMap.put(1, "aaa");
		
		Map.Entry<Integer, String> entry = null;
		
		entry = tMap.firstEntry();
		System.out.println(entry.getKey() +" "+ entry.getValue() );
		//가장 키값이 작은값  출력
		
		entry = tMap.lastEntry();
		System.out.println(entry.getKey() +" "+ entry.getValue() );
		//가장 키값이 큰값  출력
	}

}

위와 같이 entry로 전체 객체를 한 번 담아주고 entry의 get메서드를 통해 key와 value값을 출력해 보았다. 아래 출력문을 보듯이 key순으로 정렬되어 원하는 값이 출력되는 것을 확인할 수 있다.


그러면 여기서 궁금한 점이 생길 수 있다. 그러면 내림차순으로 정렬하고 싶을땐 어떻게 하지? 이를 위해 TreeMap을 descendingMap()이라는 메서드를 제공한다. 이 메서드는 리턴 값이 NavigableMap이기 때문에 해당 구조로 다시 한번 감싸 주어야 한다. 이제 코드를 살펴보자.

package tTreeMap;

import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;
import java.util.TreeMap;

public class main {

	public static void main(String[] args) {
		TreeMap<Integer, String> tMap = new TreeMap<Integer, String>();
		
		tMap.put(5, "fff");
		tMap.put(3, "bbb");
		tMap.put(2, "ccc");
		tMap.put(7, "ddd");
		tMap.put(1, "aaa");
		System.out.println("__________________________________________________");			
		NavigableMap<Integer, String> desc = tMap.descendingMap();
		Set<Map.Entry<Integer,String>> descS = desc.entrySet();
		for(Map.Entry<Integer,String> entry1 : descS) {
			System.out.println(entry1.getKey() + " " + entry1.getValue());
		}
	}

}

NavigableMap로 감싸준 TreeMap을 하나씩 출력해주기 위해서 entrySet으로 묶은 후 for문으로 하나씩 뽑아 출력해 보았다. 콘솔에 보이듯이 정상적으로 내림차순 정렬이 된 것을 확인할 수 있다.