Как я могу получить эксклюзивный набор хвостов SortedSet? - PullRequest
3 голосов
/ 10 ноября 2011

Я хочу получить эксклюзивный набор хвостов 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 для tailSet предлагает запросить подмножество, начиная со следующего элемента в домене (т. Е. Для строк, вызывающих s.tailSet(start+"\0");), однако на самом деле я работаю с такими объектами, что это будет много больше накладных расходов на его создание.

Что такое эффективный и чистый общий метод создания эксклюзивного набора хвостов?

Ответы [ 4 ]

5 голосов
/ 10 ноября 2011

Интерфейс NavigableSet является дополнительной реализацией SortedSet.Если я правильно понимаю ваш вопрос, вы можете использовать метод tailset NavigableSet, который может быть включающим или эксклюзивным, в зависимости от того, что вы предоставляете:

 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

3 голосов
/ 10 ноября 2011

Я не вижу лучшего способа, чем тот, который вы описываете.

Вы можете сделать его чуть более общим, сделав его универсальным методом:

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 голосов
/ 31 августа 2012

Гуава версия 11:

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

p.s. Существует также хак для SortedSet, если вы не можете использовать NavigableSet. Решение состоит в том, чтобы добавить для шаблона поиска специальный символ (start + "\ 0"). И этот символ добавления изменит хэш-код, и, таким образом, реализация набора хвостов по умолчанию для SortedSet будет работать нормально:

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

Это будет эквивалент java.util.TreeSet # tailSet (E fromElement, логическое включительно ) со значением false во втором параметре.


Да благословит Бог, что последний com.google.common.collect.ImmutableSortedSet (начиная с версии 12) также имеет реализацию NavigableSet.

0 голосов
/ 10 ноября 2011

это полезно?(Я просто копирую и вставляю ваши коды, о которых идет речь, и внес некоторые изменения:

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

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


    t.remove(t.first());


}

, и если у вас есть элемент "start" в качестве параметра, он также будет

t.remove(start) ;
...