2011-11-10 1 views
2

나는 SortedSet의 세트 독점 꼬리를 싶어. 내가 가지고 올 수있는 가장 짧은 방법은 다음과 같습니다는 어떻게 된 SortedSet의 독점 tailSet로받을 수 있나요?

private void exclusiveTailSet(SortedSet<String> s, String start) { 
    System.out.println(s); // [Five, Four, One, Six, Start, Three, Two] 
    SortedSet<String> t = s.tailSet(start); 
    System.out.println(t); // [Start, Three, Two] 
    Iterator<String> i = t.iterator(); 
    i.next(); 
    SortedSet<String> u = t.tailSet(i.next()); 
    System.out.println(u); // [Three, Two] 
} 

javadoc for tailSet은 (s.tailSet(start+"\0");를 호출 문자열에 대한 예) 도메인의 다음 요소부터 하위 집합을 요청하는 제안 그러나 실제로 객체 등이 함께 일하고 있어요 그것을 만드는 데 더 많은 오버 헤드가 필요할 것입니다.

독점 꼬리 세트를 만들 수있는 효율적이고 깨끗한 일반적인 방법은 무엇입니까?

답변

2

난 당신이 설명하는 것보다 더 좋은 방법이 표시되지 않습니다. 이 도움이됩니다

public static <T> SortedSet<T> exclusiveTailSet(SortedSet<T> ts, T elem) { 
    Iterator<T> iter = ts.tailSet(elem).iterator(); 
    iter.next(); 
    return ts.tailSet(iter.next()); 
} 
+0

감사합니다! 그러면 더 나은 방법을 찾으려고하지 않을 것입니다.일반적인 방법이 좋았고 새로운 세트't'를 정의 할 필요가 없다는 것을 눈치 채지 못했습니다. – tttppp

+0

또한'NoSuchElementException'에 try catch 블록을 추가하여이 경우 빈 TreeSet을 반환합니다. – tttppp

+0

예. 그 경우도 내 마음을 쳤다. 좋은 해결책 ... 실제로, 빈 테일 세트를 반환해야한다. (반환 된 세트가 주어진 세트에 의해 뒷받침되어야하는 다른 구현과 일관되게). – aioobe

5

하는 NavigableSet 인터페이스의 SortedSet의 subimplementation이다. 내가 질문을 이해한다면 제대로은 포함 또는 독점이 될 당신이 제공 개요 boolean 내용에 따라 할 수있는 능력을 가지고 해 NavigableSet의 tailSet로 방법을 사용할 수 있습니다.

NavigableSet<E> tailSet(E fromElement, boolean inclusive) 
     Returns a view of the portion of this set whose elements are greater than (or equal  to, if inclusive is true) fromElement. 

http://download.oracle.com/javase/6/docs/api/java/util/NavigableSet.html

+1

SortedSet은 NavigableSet 인터페이스를 구현합니다. SortedSet은 NavSet의 슈퍼 인터페이스입니다. – Kent

+0

@Kent 죄송합니다. 당신이 올바른지. – Mechkov

+0

@Mechkov이므로 'SortedSet'을 입력으로 사용하면'NavigableSet '이라고 가정 할 수 없습니다. 즉, 사용자의 대답으로 문제가 해결되지 않습니다. – aioobe

0

:

당신은 일반적인 방법함으로써, 비록 약간 더 일반적인 만들 수 있습니까? 가 (난 그냥 복사 질문에 코드를 붙여 일부 변경했다 : 그것은 또한 것

private void exclusiveTailSet(SortedSet<String> s, String start) { 

    SortedSet<String> t = s.tailSet(start); 


    t.remove(t.first()); 


} 

을하고있는 경우 매개 변수로 요소를 "시작"

t.remove(start) ; 
+0

이것은's'도 변경한다는 점에 유의하십시오. 아마도 원하는 행동이 아닙니다. 꼬리 세트의 복사본을 만들고 복사본에서 요소를 제거 할 수는 있지만 원본 접근법을 로그에서 선형으로 변경하기 때문에 훨씬 더 위험합니다. – aioobe

+0

@aioobe 당신 말이 맞습니다. – Kent

-1

구아바 버전 11 :

SortedSet exclusiveTailSet = Sets.filter(eSortedSet, Ranges.greaterThan(start)); 

PS이 경우 SortedSet에 대한를 해킹도 당신 NavigableSet을 사용할 수 없습니다. 해결책은 검색 패턴에 특수 기호 (start + "\ 0")를 추가하는 것입니다. 그리고이 또한 기호의 해시 코드를 변경하고, 따라서 SortedSet의 기본 tailSet로 구현은 잘 작동합니다 :

SortedSet<String> t = s.tailSet(start+"\0"); 

그것은되는 java.util.TreeSet # tailSet로의 동등한 것 (E fromElement에, 부울 포함) 두번째 파라미터 거짓 값.


하나님이 마지막 com.google.common.collect.ImmutableSortedSet은 (버전 12부터)도 해 NavigableSet의 구현을 가지고 축복.

+1

안녕하세요 - Guava에 대한 제안에 감사드립니다. 나는 나의 질문에 start + "\ 0"방법을 사용하기를 원하지 않는다고 언급했다 - 이것은 실제적으로 적합하지 않았다. 이것은 객체로 작업하는 나의 실제 시나리오의 단순화 였기 때문이다. 정렬 순서에서 다음에 있었던 객체를 생성하는 것은 상당히 큰 오버 헤드처럼 보였다. – tttppp