Logo

[자바] NavigableSet 사용법

자바6에서 추가된 NavigableSet에 대해서 알아보도록 하겠습니다.

NavigableSetSortedSet을 확장한 인터페이스입니다. 따라서 기존 SortedSet 대비 추가된 기능 위주로 살펴보는 게 좋을 것 같습니다.

객체 생성

자바에서 제공하는 NavigableSet 인터페이스의 대표적인 구현 클래스는 TreeSet 입니다. 따라서 TreeSet 객체를 생성 후에, NavigableSet 타입 변수에 할당하기면 하면 됩니다.

NavigableSet<String> animalSet = new TreeSet<>(Arrays.asList("Dog", "Cat", "Tiger", "Lion", "Elephant"));
// [Cat, Dog, Elephant, Lion, Tiger]

역순 접근: descendingIterator, descendingSet

SortedSet을 사용할 때 가장 아쉬운 점이 정렬된 원소들을 역방향으로 순회하기가 난해하다는 것입니다. SortedSetList의 하위 타입이 아니므로 인덱스를 이용한 접근이 불가능 합니다. 궁여지책으로 역순으로 정렬을 해주는 새로운 SortedSet을 생성하곤 했습니다.

Set<String> revAnimalSet = new TreeSet<>(Collections.reverseOrder());
revSet.addAll(animalSet);

for (String animal : revAnimalSet) {
  System.out.println(animal);
}

SortedSet의 이러한 단점을 보완하기 위해서, NavigableSet은 역방향 이터레이터를 반환하는 descendingIterator 메소드를 제공합니다.

for (Iterator<String> iter = animalSet.descendingIterator(); iter.hasNext(); ) {
  System.out.println(iter.next());
}

또한 descendingSet 메소를 이용하여, 역순으로 정렬된 새로운 Set을 얻을 수도 있습니다.

NavigableSet<String> revAnimalSet = animalSet.descendingSet();
System.out.println(revAnimalSet);
// [Tiger, Lion, Elephant, Dog, Cat]

처음 또는 마지막 원소 제거: pollFirst, pollLast

SortedSetfirstlast 메소드를 이용해서 처음 또는 마지막 원소를 얻을 수 있는데요. NavigableSet은 추가로 해당 원소를 삭제까지 해줍니다.

String first = animalSet.pollFirst();
System.out.println("#first: " + first); // #first: Cat

String last = animalSet.pollLast();
assertThat(last).isEqualTo("Tiger");(); // #last: Tiger

즉, 아래 두 개의 코드는 동일한 처리를 한다고 보시면 됩니다.

String first = animalSet.pollFirst();
String first = animalSet.first();
animalSet.remove(first);

가장 근접한 원소 탐색: ceiling, floor, higher, lower

주어진 값 기준으로 가장 근접하게 큰 원소나 작은 원소를 알아낼 수 있습니다. ceilingfloor는 주어진 값과 동일한 원소가 있을 경우, 해당 원소를 반환하는 반면에(inclusive), higherlower는 해당 원소를 제외한 원소 중에서 찾습니다.(exclusive)

정리하면, 이상(ceiling), 이하(floor), 초과(higher), 미만(lower) 기능이 되겠네요. 예를 들어, Elephant 기준으로 4 종류의 메소드를 호출하면 다음과 같습니다.

String ceiling = animalSet.ceiling("Elephant");
System.out.println("#ceiling: " + ceiling); // #ceiling: Elephant

String floor = animalSet.floor("Elephant");
System.out.println("#floor: " + floor); // #ceiling: Elephant

String higher = animalSet.higher("Elephant");
System.out.println("#higher: " + higher); // #higher: Lion

String lower = animalSet.lower("Elephant");
System.out.println("#lower: " + lower); // #lower: Dog

유용한 유즈 케이스가 딱 떠오르지는 않는데, 좀 더 고민을 사용을 해봐야 할 것 같습니다.

이상으로 NavigableSet 사용법에 대해서 알아보았습니다.

참고