SortedMap에 추가된 메서드

JDK는 Map 인터페이스의 두 가지 확장을 제공합니다: SortedMapNavigableMap. NavigableMapSortedMap의 확장입니다. 두 인터페이스는 모두 같은 클래스에 의해 구현됩니다: TreeMap 클래스는 잘 알려진 데이터 구조인 레드-블랙랙 트리입니다.

SortedMapNavigableMap은 키/값 쌍을 키별로 정렬된 상태로 유지합니다. SortedSetNavigableSet과 마찬가지로 이러한 키를 비교할 수 있는 방법을 제공해야 합니다. 이를 위한 두 가지 해결책이 있습니다: 키의 클래스에서 Comparable을 구현하거나 TreeMap을 만들 때 키에 대한 Comparator를 제공하는 것입니다. Comparator를 제공하면 키가 비슷하더라도 비교자가 사용됩니다.

만약 SortedMap 또는 NavigableMap에 대해 선택한 구현이 TreeMap이라면, keySet() 또는 entrySet()에 대한 호출로 반환된 set를 SortedSet 또는 NavigableSet에 안전하게 캐스팅할 수 있습니다. NavigableMap에는 일반 keySet() 메서드 대신 사용할 수 있는 NavigableSet의 인스턴스를 반환하는 navigableKeySet() 메서드가 있습니다. 두 메서드 모두 동일한 객체를 반환합니다.

SortedMap 인터페이스는 Map에 다음 메서드를 추가합니다:

이 맵은 SortedMap의 인스턴스이며 이 맵에 의해 뒷받침되는 뷰입니다. 이 Map에 대한 모든 변경 사항은 이 보기에서 볼 수 있습니다. 이러한 보기는 업데이트할 수 있지만 사용자가 만든 Map의 경계 외부에 키를 삽입할 수 없다는 제한이 있습니다.

다음 예제에서 이 동작을 확인할 수 있습니다:

SortedMap<Integer, String> map = new TreeMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
map.put(5, "five");
map.put(6, "six");
 
SortedMap<Integer, String> headMap = map.headMap(3);
headMap.put(0, "zero"); // this line is ok
headMap.put(4, "four"); // this line throws an IllegalArgumentException

 

특정 키 또는 항목에 액세스하기

NavigableMapSortedMap에 더 많은 메서드를 추가합니다. 첫 번째 메서드 세트는 Map의 특정 키와 항목에 대한 액세스를 제공합니다.

Queue-Like 기능으로 Map에 액세스하기

두 번째 세트는 Queue와 유사한 기능을 제공합니다:

역순으로 Map 트래버스하기

세 번째 Set은 마치 역 비교 로직에 기반한 것처럼 Map을 반전시킵니다.

두 뷰 모두 요소 제거를 지원하지만 이를 통해 아무것도 추가할 수 없습니다.

다음은 두 뷰를 사용하는 방법을 보여주는 예제입니다.

NavigableMap<Integer, String> map = new TreeMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
map.put(4, "four");
map.put(5, "five");
 
map.keySet().forEach(key -> System.out.print(key + " "));
System.out.println();
 
NavigableSet<Integer> descendingKeys = map.descendingKeySet();
descendingKeys.forEach(key -> System.out.print(key + " "));

이 코드를 실행하면 다음과 같은 결과가 출력됩니다.

1 2 3 4 5 
5 4 3 2 1 

하위 Submap 뷰 가져오기

마지막 메서드 세트는 Map의 일부에 대한 보기에 액세스할 수 있게 해줍니다.

이러한 맵은 이 맵의 보기이며, 키/값 쌍을 제거하거나 추가하여 업데이트할 수 있습니다. 하지만 요소를 추가할 때 한 가지 제한 사항이 있습니다. 뷰가 만들어진 경계 밖에서는 키를 추가할 수 없습니다.