如何获得SortedSet的独家尾部?

时间:2011-11-10 13:49:34

标签: java sortedset

我想得到一个SortedSet的独有尾部集。我能提出的最短的方法是:

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");的字符串),但是我实际上正在处理对象,这样就更多了创造它的开销。

创建独占尾部集合的有效且干净的一般方法是什么?

4 个答案:

答案 0 :(得分:5)

NavigableSet接口是SortedSet的子实现。如果我正确理解你的问题,你可以使用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 :(得分:3)

我没有看到比你描述的方法更好的方法。

通过使其成为通用方法,您可以使它更加通用:

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());
}

答案 2 :(得分:0)

这有用吗? (我只是复制并粘贴您的代码,并做了一些更改:

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

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


    t.remove(t.first());


}

如果您将“start”元素作为参数,那么它也将是

t.remove(start) ;

答案 3 :(得分:-1)

番石榴版11:

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

p.s。如果您无法使用NavigableSet,还有SortedSet的 hack 。解决方案是为搜索模式添加一个特殊符号(开始+&#34; \ 0&#34;)。此添加符号将更改hashCode,因此SortedSet的默认tailset实现将正常工作:

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

它将相当于java.util.TreeSet#tailSet(E fromElement,boolean inclusive ),在第二个参数中具有 false 值。


上帝保佑最后一个com.google.common.collect.ImmutableSortedSet(自版本12以来)也有NavigableSet的实现。