본문 바로가기
Old Posts/Java

[Java] SortedMap 사용법 및 예제

by A6K 2023. 5. 24.

자바에서 Map<K, V> 인터페이스는 Key와 Value 쌍을 저장하기 위해 사용된다. Map<K, V> 인터페이스를 상속하여 정의된 SortedMap<K, V>은 Key와 Value 쌍을 순서를 유지하면서 저장한다.

SortedMap

Map 인터페이스를 상속하는 SortedMap은 Key-Value 쌍을 정렬된 순서대로 저장한다. Map 인터페이스에서 정의하는 것처럼 Key를 통해 Value를 얻어올 수 있으며, 동시에 정렬된 순서대로 Key-Value 쌍을 순회할 수도 있다. Map에 저장되는 데이터를 순서대로 접근하고 싶은 경우 사용하면 좋다.

SortedMap에 저장되는 Key-Value는 Key값의 Natural Order에 맞게 저장된다. Key 클래스가 Comparable 인터페이스를 구현하도록하거나 SortedMap의 생성자에 Comparator를 넘겨주어 정렬된 순서를 정할 수 있다.

SortedMap 예제

SortedMap 인터페이스의 대표적인 구현체로 java.util.TreeMap이 있다.

SortedMap sortedMap = new TreeMap();

SortedMap 생성자에 Comparator를 인자로 주면, 저장되는 데이터의 정렬 순서에 사용된다.

Comparator comparator = new MyComparatorImpl();
SortedMap sortedMap = new TreeMap(comparator);

SortedMap은 기본적으로 Key의 오름차순으로 저장한다. Comparable 혹은 Comparator를 기준으로 작은 값부터 시작해 큰 값으로 저장된다. 내림차순으로 저장하고 싶은 경우 TreeMap.descendingKeySet()을 사용하면 된다.

SortedMap에 저장되어 있는 엘리먼트들을 순회하기 위해서 iterator를 이용할 수 있다.

SortedMap sortedMap = new TreeMap();

sortedMap.put("a", "one");
sortedMap.put("b", "two");
sortedMap.put("c", "three");

Iterator iterator = sortedMap.keySet().iterator();

while(iterator.hasNext()) {
    String key   = (String) iterator.next();

    String value = (String) sortedMap.get(key);
}

SortedMap 주요 메소드

SortedMap은 Map 인터페이스를 상속한다. 따라서 Map 인터페이스에 정의되어 있는 메소드들을 구현해야 한다. SortedMap이 정의하는 메소드들은 JavaDoc을 통해 확인하자. (링크 : Interface SortedMap<K, V>)

Map 인터페이스에서 정의한 메소드 이외에 SortedMap이 정의하는 주요 메소드는 다음과 같다.

Method 설명
getComparator() 정렬에 사용된 Comparator를 리턴
firstKey() SortedMap에 저장된 데이터 중 가장 작은 Key를 리턴
lastKey() SortedMap에 저장된 데이터 중 가장 큰 Key를 리턴
headMap(K toKey) toKey보다 큰 값들로 구성되어 있는 SortedMap을 리턴
tailMap(K fromKey) fromKey보다 큰 값들로 구성되어 있는 SortedMap을 리턴
subMap(K fromKey, K toKey) fromKey 보다 크거나 같고, toKey보다 작은 키들로 구성된 SortedMap을 리턴

그림으로 그려보면 다음과 같다.

headMap(), tailMap(), subMap() 메소드를 이용해 정렬된 Key-Value 쌍의 특정 부분을 SortedMap으로 리턴받아 가져올 수 있다. 각 메소드에 인자로 넘겨주는 키 값이 리턴되는 SortedMap에 포함되는지 포함되지 않는지를 유의해야한다. fromKey는 리턴되는 맵에 포함되고, toKey는 포함되지 않는다.

Map 인터페이스의 구현체는 Java에서 가장 많이 사용되는 자료구조 중 하나다. HashMap을 가장 많이 쓰겠지만 구현하는 로직에 따라SortedMap을 구현한 TreeMap 같은 것들도 많이 사용한다. Map을 구현한 각 클래스들의 특성을 잘 알아두면 필요한 곳에 필요한 클래스를 적절하게 사용할 수 있을 것이다.

댓글