[자바] NavigableSet 사용법
자바6에서 추가된 NavigableSet에 대해서 알아보도록 하겠습니다.
NavigableSet은 SortedSet을 확장한 인터페이스입니다. 따라서 기존 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을 사용할 때 가장 아쉬운 점이 정렬된 원소들을 역방향으로 순회하기가 난해하다는 것입니다. SortedSet은 List의 하위 타입이 아니므로 인덱스를 이용한 접근이 불가능 합니다. 궁여지책으로 역순으로 정렬을 해주는 새로운 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
SortedSet에 first와 last 메소드를 이용해서 처음 또는 마지막 원소를 얻을 수 있는데요. 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
주어진 값 기준으로 가장 근접하게 큰 원소나 작은 원소를 알아낼 수 있습니다.
ceiling과 floor는 주어진 값과 동일한 원소가 있을 경우, 해당 원소를 반환하는 반면에(inclusive), higher와 lower는 해당 원소를 제외한 원소 중에서 찾습니다.(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 사용법에 대해서 알아보았습니다.
참고
This work is licensed under
CC BY 4.0