Как получить последние 25 элементов SortedSet? - PullRequest
10 голосов
/ 24 февраля 2009

В Java у меня есть SortedSet, который может иметь 100 000 элементов. Я хотел бы эффективно и элегантно получить последние 25 элементов. Я немного озадачен.

Чтобы получить сначала 25, я бы повторил и остановился после 25 элементов. Но я не знаю, как перебирать в обратном порядке. Есть идеи?

SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(

Ответы [ 7 ]

15 голосов
/ 24 февраля 2009

Вам нужен NavigableSet. Иначе вам придется делать это неэффективно, перебирая все SortedSet и собирая элементы в Queue, который вы обрезаете до 25 элементов.

4 голосов
/ 24 февраля 2009

SortedSet <T> был разработан с использованием очень простой итерационной модели, только для пересылки, поэтому поиск первых n записей прост, но для поиска последней потребовалось бы дорогое чтение через итератор, поддерживающий окно из последних n записей.

NavigableSet <T> добавление в 1.6 решает эту проблему (и единственная реализация SortedSet из 1.4 TreeSet реализует это, так что, вероятно, это будет замена для вас).

NavigableSet<T> set = new TreeSet<T>();
// add elements
set.descendingIterator() // iterate over the last n entires as needed
3 голосов
/ 24 февраля 2009

Поменяйте местами сортировку и возьмите первые 25 предметов. Затем вы можете отменить те, которые будут эффективны, так как его всего 25 пунктов.

Bruce

1 голос
/ 27 января 2014

Возможно, вы захотите взглянуть на IndexedTreeMap в indexed-tree-map

Используйте точное (size-25), чтобы получить элемент по индексу без итерации.

1 голос
/ 24 февраля 2009

Бросьте набор в список и используйте subList (). Я не уверен, насколько быстрым является создание списка, поэтому вам придется запустить несколько тестов. Это, конечно, сделает кодирование простым.

    List f = new ArrayList( summaries);
    List lastTwentyFive = f.subList( summaries.size() - 25, summaries.size() );
1 голос
/ 24 февраля 2009

Для этой операции больше подойдет другая структура данных.

Это не элегантный и не очень эффективный , но при условии, что SortedSet находится в порядке возрастания, вы можете получить элемент Last () и удалить его, сохранив его в другом списке и повторив 25 раз. Затем вам нужно будет вернуть эти элементы обратно!

0 голосов
/ 24 февраля 2009

Я предполагаю, что это вряд ли будет иметь какое-либо реальное применение в вашем проекте, но стоит отметить, что вы могли бы просто иметь возможность отсортировать список в противоположном направлении:)

...