본문 바로가기
Old Posts/Java

[Java] NavigableMap 사용법 및 예제

by A6K 2023. 5. 25.

Java NavigableMap 인터페이스는 SortedMap을 상속하는 인터페이스다. Map 인터페이스를 상속한 SortedMap 인터페이스를 상속하고 있기 때문에 Map, SortedMap에 정의되어 있는 메소드를 정의해야한다.

NavigableMap

NavigableMap은 저장된 Key-Value 엔트리에 Navigation 기능을 더해주고 있다. 즉, SortedMap이므로 Key-Value 엔트리가 정렬된 상태로 저장된다. 여기에 찾고자 하는 Key 값에 가장 가까운 엔트리를 찾는 Navigation 메소드가 추가되었다.

NavigableMap의 JavaDocs를 보면 다음과 같이 설명되어 있다.

A SortedMap extended with navigation methods returning the closest matches for given search targets.

NavigableMap에는 floorEntry(), ceilingEntry(), lowerEntry(), higherEntry() 같은 Navigation 메소드가 제공된다.

NavigationMap은 인터페이스기 때문에 실제 로직에서 사용하기 위해 인터페이스에 정의되어 있는 메소드들을 구현해야한다. 가장 널리 사용되는 구현체는 TreeMap이다.

Map map = new TreeMap();
SortedMap sortedMap = new TreeMap();
NavigableMap navigableMap = new TreeMap();

NavigableMap 메소드

NavigableMap에서 정의하는 주요 메소드는 다음과 같다.

Method 설명
ceilingEntry(K key) key 값보다 같거나 큰 키 값 중에 가장 작은 키 값의 Entry 리턴, 그런 Key가 없으면 null 리턴
ceilingKey(K key) Key 값보다 같거나 큰 키 값을 리턴, 없으면 null
descendingKeySet() Map에 들어있는 키 값을 내림차순으로 담는 NavigableSet 리턴
descendingMap() Map을 내림차순 기준으로 사용할 수 있는 NavigableMap 리턴
firstEntry() Map에 있는 가장 작은 키에 해당하는 Entry 리턴
floorEntry(K key) key 값과 비교해서 같거나 작은 키 값들 중에서 가장 큰 키 값에 해당하는 Entry 리턴
floorKey(K key) key 값과 비교해서 같거나 작은 키 값들 중에서 가장 큰 키 값을 리턴
headMap(K toKey) toKey를 기준으로 그것보다 작은 Key 값을 갖는 Entry로 구성된 SortedMap을 리턴
headMap(K toKey, boolean inclusive) toKey를 기준으로 그것보다 작은 Key 값을 갖는 Entry로 구성된 NavigableMap을 리턴 inclusive가 true면 toKey도 포함
higherEntry(K key) key 값보다 큰 키 값 중에 가장 작은 키 값의 Entry 리턴, 그런 Key가 없으면 null 리턴
higherKey(K key) Key 값보다 큰 키 값을 리턴, 없으면 null
lastEntry() Map에 있는 가장 큰 KEy 값에 해당하는 Entry 리턴
lowerEntry(K key) key 값보다 작은 키 값 중에 가장 큰 키 값의 Entry 리턴, 그런 Key가 없으면 null 리턴
lowerEntry(K key) key 값보다 작은 키 값 중에 가장 작은 키 값 리턴, 없으면 null
navigableKeySet() Map에 있는 키 값들을 담고 있는 NavigableSet 리턴
pollFirstEntry() Map에 있는 가장 작은 키 값에 해당하는 Entry 리턴, 맵이 비어있으면 null 리턴
pollLastEntry() Map에 있는 가장 큰 키 값에 해당하는 Entry 리턴, 맵이 비어있으면 null 리턴
subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) fromKey 부터 toKey 까지 포함하는 subMap을 리턴 (inclusive true인 경우 from, to 키를 결과에 포함)
subMap(K fromKey, K toKey) fromKey 부터 toKey 까지 포함하는 subMap을 리턴
tailMap(K fromKey) fromKey를 기준으로 그것보다 큰 key 값을 갖는 Entry로 구성된 SortedMap을 리턴
tailMap(K fromKey, boolean inclusive) fromKey를 기준으로 그것보다 큰 key 값을 갖는 Entry로 구성된 NavigableMap을 리턴 (inclusive가 true면 fromKey도 포함)

NavigableMap 예제

NavigableMap이 제공하는 메소드와 특성을 이용한 예제를 생각해보자. 시험 점수에 따른 등급을 출력하는 예제를 생각해보자.

if-else 구문을 이용하면 다음과 같이 작성할 수 있다.

String grade;
int point = 94;

if (point >= 90)
  grade = "수";
else if (point >= 80)
  grade = "우";
else if (point >= 70)
  grade = "미";
else if (point >= 60)
  grade = "양";
else
  grade = "가";

System.out.println("Grade : " + grade);

동일한 로직을 NavigableMap을 이용해 작성하면 다음과 같다.

NavigableMap<Integer, String> map = new TreeMap<>();
map.put(100, "수");
map.put(89, "우");
map.put(79, "미");
map.put(69, "양");
map.put(59, "가");

String grade = map.ceilingEntry(94).getValue();
System.out.println("Grade : " + grade);

ceilingEntry() 메소드는 입력받은 키 값보다 큰 방향으로 가장 인접한 키의 엔트리를 리턴한다. 94를 입력한 경우 94보다 큰 키인 100에 해당하는 엔트리가 리턴되므로 수라는 글자가 출력된다.

댓글