我想得到一个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");
的字符串),但是我实际上正在处理对象,这样就更多了创造它的开销。
创建独占尾部集合的有效且干净的一般方法是什么?
答案 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的实现。