본문 바로가기

java

[230813] java TreeMap

 

TreeMap은 key를 기준으로 요소를 정렬해주는 레드블랙트리 기반의 Map이다. 일반적으로는 자연적인 순서를 기반으로 정렬을 해주는데, comparator를 구현하였을 경우에는 그 순서대로 정렬을 해 준다. 

 

NavigableMap을 구현하고 있는데, NaigableMap의 코드를 보면 또 SortedMap을 구현하고 있다. 

즉 TreeMap을 정렬 가능한 맵으로 만들어주는 기본 포맷은 SortedMap이라고 볼 수 있다. 

 

처음에 TreeMap을 사용하려고 했을 때 HashMap을 사용할 때처럼 Map 인터페이스에 TreeMap을 선언했는데, 이렇게 하니까 정렬에 관련된 메서드가 동작이 안 되었다.

 

TreeMap을 선언할 때는 인터페이스에 선언하는 게 아니라 NavigableMap에 선언해야 한다. 

SortedMap 인터페이스에 선언해도 되는데, 이렇게 할 때보다 NavigableMap으로 선언했을 때 사용 가능한 메서드가 더 많다. 

// Map 인터페이스에 TreeMap을 생성하는 방식 => NavigableMap이 가진 정렬관련 메서드 사용이 불가능하다. 
Map<Integer, Integer> map = new TreeMap<>();

// NavigableMap 인터페이스로 생성해야 정렬 기능을 사용할 수 있다. 
NavigableMap<Integer, Integer> map = new NavigableMap<>();

// 이렇게 해도 되지만 이왕이면 위처럼 인터페이스로 선언하자. 
TreeMap<Integer, Integer> map = new TreeMap<>();

 

사용 예시는 아래와 같다. 

public static void main(String[] args) throws Exception {
    NavigableMap<Integer, String> map = new TreeMap<>();

    map.put(1, "first");
    map.put(3, "third");
    map.put(2, "second");

    map.entrySet().stream().forEach(e -> System.out.println(e));

    System.out.println("첫번째 키: " + map.firstKey());
    System.out.println("마지막 키: " + map.lastKey());
    System.out.println("첫번째 요소: " + map.firstEntry().toString());
    System.out.println("마지막 요소: " + map.lastEntry().toString());

    System.out.println("주어진 값보다 크거나 같은 키: " + map.floorKey(2));
    System.out.println("주어진 값보다 큰 키: " + map.higherKey(2));

}
// 실행 결과 

1=first
2=second
3=third
첫번째 키: 1
마지막 키: 3
첫번째 요소: 1=first
마지막 요소: 3=third
주어진 값보다 크거나 같은 키: 2
주어진 값보다 큰 키: 3

 

firstKey, lastKey 같은 메서드도 있어서 정렬이 되는 Deque처럼 사용할 수도 있다. 

이외에도 subMap, headMap과 같이 특정 키 값을 기준으로 Map을 자르는 메서드도 있다. 

 

더 많은 메서드는 javadoc에서 확인하면 된다.