The SortedSet Interface
SortedSet
은Set
의 구현체이다. 이것은 엘리먼트를 오름차순으로 정렬을 수행하며, 엘리먼트들은 자연적인 소트나, Comparator에서 제공한 정렬 방식으로 생성시에 저장이 된다. 추가적으로 normal Set의 처리를 포함하고 있으며, SortedSet 인터페이스는 다음과 같은 오퍼레이션을 지원하고 있다.다음과 같은 인터페이스를 지원하고 있다.
Range view
— sorted set에서 범위처리에 대한 지원을 수행한다.Endpoints
— sorted set에서 첫번째와 마지막 엘리먼트를 반환한다.Comparator access
— set에서 소트를 수행할때 사용된 Comparator을 반환한다. (단, Comparator을 이용하여 소트를 수행한 경우에)
public interface SortedSet<E> extends Set<E> {
// Range-view
SortedSet<E> subSet(E fromElement, E toElement);
SortedSet<E> headSet(E toElement);
SortedSet<E> tailSet(E fromElement);
// Endpoints
E first();
E last();
// Comparator access
Comparator<? super E> comparator();
}
Set Operations
Set으로 부터 상속받은 SortedSet 처리는 소트된 집합과 일반 집합을 구분할 수 있는 다음의 예외사항들이 있다.비록 인터페이스가 이러한 작업을 보장해주지는 않지만 toString 메소드는 Set에 저장된 모든 엘리먼트들의 정렬된 순서대로 값을 출력하게 해 준다.
- iterator 오퍼레이션에 의해 반환된 Iterator객체는 소트된 순서로 반복을 수행한다.
- toArray에 의해서 변환된 배열은 소트된 순서대로 엘리먼트를 저장하게 된다.
Standard Constructors
관습적으로 모든 범용 Collection 구현체는 생성자를 가지며, 다양한 컬렉션을 자신의 컬렉션 형태로 변환해준다. SortedSet 역시 예외는 아니다. TreeSet에서 sorts를 수행하면 자연 정렬 순서대로 엘리먼트가 소트되어 저장이 된다. 이것은 아마 실수 일 것이다. 그러므로 SortedSet 인스턴스에서는 좀더 낳은 방법을 지원하기 위해서 TreeSet을 소트된 셋으로 저장하기 위한 방법을 제공하고 있으며, 이것이 comparator이나 natural ordering의 방식을 지원한다. TreeSet이 이러한 접근방식을 따르므로 SortedSet이나 새로운 TreeSet에는 동일한 엘리먼트를 동일한 제약조건에 따라 저장하도록 하고 있다. 실행 시간 혹은 실행시간 타입결정이 아니라도 이러한 변환은 가능하도록 제공된다.
SortedSet은 또한 Comparator과 특정 Comparator에 의해서 정렬될 수있는 빈 set을 반환하는 생성자를 가지고 있다. 만약 null이 생성자에 전달된다면 natural ordering을 수행하게 된다.
Range-view Operations
range-view 처리는 List 인터페이스와 같이 순차적인 처리를 수행할 수 있도록 해준다. 그러나 여기에는 큰 차이점이 있다. sorted set의 Range view는 backing sorted set이 직접적으로 변경되는 경우 검증을 해야한다.
이러한 상황은 당연히 존재할 수 있는 상황이다. 왜냐하면 sorted set의 range view의 엔드포인트가 backing collection의 특정 엘리먼트가 아닌 엘리먼트 영역에서 절대 위치에 존재하는 경우에 그러한 사황이 발생한다. 이것은 List의 경우와 동일하다. sorted set의 range-view는 엘리먼트 영역의 디자인된 부분에서 위치값이 어디에 놓여 있는지에 따라 그 처리가 결정된다. range-view 를 변경하면 sorted set의 backing 부분에 변경을 가하게 된다. 그러므로 리시트의 range-view와는 달리 이것은 range-view를 오랫동안 이용가능하게 된다.
sorted set은 다음 3개의 범위 처리를 지원한다. 첫번째는 subSet이며, 2개의 엔드포인트를 가진다. 이것은 subList와 같다. 이 엔드포인트는 sorted set에서 엘리먼트의 비겨롤 수행하게 되며, 이것은 Comparator이나 자연 정렬을 통해서 이루어진다. subList와 같이 range는 반개방이며, 낮은 엔드포인트는 포함하며, 뒤에 엔드포인트는 포함하지 않는다.
그러므로 다음 코드는 doorbell과 pickel사이에 얼마나 많은 단어가 존재하는지 보여주는 예이다. 이것은 doorbell은 포함하고, pickle는 포함하지 않는다. 스트링을 가지고 있는 sorted Set은 dictionary라고 불린다.
이러한 형식에 따라, 다음 한라인 "f" 단어부터 시작해서 모든 엘리먼트를 제거한다.int count = dictionary.subSet("doorbell", "pickle").size();
유사한 방법으로 각 단어부터 시작해서 얼마나 많은 내용이 있는지를 출력한다.dictionary.subSet("f", "g").clear();
생각하듯이 폐쇠된 간격사이의 뷰를 원하는 경우 각 엔드포인트는 포함될 것이다. 만약 엘리먼트 타입이 엘리먼트 공간에서 주어진 값의 연속적인 값을 이용하여 계산을 원하는경우, 단지 subSet을 이용하여 lowEndpoint 에서 highEndpoint를 요청하면 된다. 비록 이것이 명백하게 전체 내용을 포함하고 있지 않지않지만, 문자열 s가 자연 정렬이 되어 잇다고 할때 s +for (char ch = 'a'; ch <= 'z'; ) {
String from = String.valueOf(ch++);
String to = String.valueOf(ch);
System.out.println(from + ": " +
dictionary.subSet(from, to).size());
}
"\0"으로 널 문자열을 포함하고 있는 것이다.
그러므로 다음 한 라인은 doorbell과 pickel 사이에 얼마나 많은 단어가 포함되어 잇는지 알려준다. 이것은 doorbell과 pickle는 포함되어 있으며, 사전순으로 저장되어 있다.
유사한 기술로 open interval (개방형 범위) 뷰를 이용할 수도 있다. 이것은 endpoint를 포함하고 있는 것이다. open interval 뷰는 logwEndpoint 에서 highEndpoint까지 값으로 이것은 반개방 까지 표현이 가능하다. 다음 라인은 doorbell과 pickle를 둘다 포함하지 않는 결과를 반환한다.count = dictionary.subSet("doorbell", "pickle\0").size();
SortedSet 인터페이스는 2개 이상의 범위 처리를 포함하고 있다. headSet과 tailSet이 그것이며 둘다 하나의 객체 아규먼트를 갖는다. 결과값으로 backing SortedSet의 초기값에 대한 뷰를 반환한다.count = dictionary.subSet("doorbell\0", "pickle").size();
The former returns a view of the initial portionof the backingSortedSet
, up to but not including the specifiedobject. The latter returns a view of the final portion of the backingSortedSet
, beginning with the specified object and continuingto the end of the backingSortedSet
. Thus, the following codeallows you to view the dictionary as two disjointvolumes
(a-m
andn-z
).SortedSet<String> volume1 = dictionary.headSet("n");
SortedSet<String> volume2 = dictionary.tailSet("n");
Endpoint Operations
SortedSet 인터페이스는 첫번째와 마지막 엘리먼트를 반환하는 처리를 수행할 수 있도록 하고 있다. first와 last라고 불리는 것은 별로 놀라운 것이 아니다. 추가적으로 명백한 이용 가치가 있다는 것이다. last는 SortedSet 인터페이스에서 의존성을 위한 대안으로 이용된다. SortedSet을 구현하고 셋 내부에서 전방향 혹은 후방향으로 이동하면서 처리를 원하는 경우가 잇을 것이다. 이러한 처리는 내부에서 전방향으로 이동하기 쉬운 방법을 제공한다. 그러나 아쉽게도 backwork로는 이동이 쉽지 않다.다음은 엘리먼트 영역에서 특정 객체 o보다 적은 첫번째 엘리먼트를 찾는 것이다.
이것은 sorted set내부에 특정 포인트로 부터 backwork 엘리먼트를 찾는 좋은 방법이다. 반복적으로 이러한 방법을 backwork로 적용이 가능하다. 그러나. 이것은 객체를 찾고 그것을 반환하기는 하지만 비효율 적인 방법이다.Object predecessor = ss.headSet(o).last();
Comparator Accessor
SortedSet 인터페이스는 comparator라는 접근 메소드를 지원하고 있으며 이 메소드는 Comparator을 이용하고 있는 경우 해당 객체를 , 그렇지 않은경우 null을 반환한다. (null일 경우 natural ordering을 수행한 경우이다.) 이것은 이전의 sorted set을 새로운 sorted set으로 복사를 할때 동일한 정렬 방식을 지원하도록 해준다. 이것은 SortedSet에 의해서 이용되며 생성자는 previously에 정의되어 있다.
'WEB_Programming > Pure Java' 카테고리의 다른 글
Get disconnected with CachedRowSet (0) | 2008.11.04 |
---|---|
The SortedMap Interface (1) | 2008.11.03 |
Object Ordering (0) | 2008.10.29 |
The Map Interface (0) | 2008.10.28 |
The Queue Interface (0) | 2008.10.28 |