Как получить последние 25 элементов SortedSet?
Вопрос
В Java у меня есть SortedSet, который может содержать 100 000 элементов.Я хотел бы эффективно и элегантно получить последние 25 элементов.Я немного озадачен.
Чтобы получить Первый 25 Я бы повторил и остановился после 25 элементов.Но я не знаю, как выполнить итерацию в обратном порядке.Есть какие-нибудь идеи?
SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
Решение
Вам нужен NavigableSet
.В противном случае вам придется делать это неэффективно, повторяя весь SortedSet
и собирать элементы в Queue
который вы сохраняете обрезанным до 25 элементов.
Другие советы
Сортированный набор<T>
был разработан с учетом очень простой итерационной модели, только вперед, таким образом, найти верхние n записей легко, но для поиска последней потребуется дорогостоящее чтение через итератор, поддерживающий окно последних n записей.
Навигационный набор<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
Измените сортировку в обратном порядке и возьмите первые 25 товаров.Затем вы можете отменить те, которые будут эффективны, поскольку в них всего 25 элементов.
Брюс
Для этой операции более подходящей была бы другая структура данных.
Это не элегантный способ и не очень эффективный, но предполагая, что SortedSet находится в порядке возрастания, вы могли бы получить элемент Last() и удалить его, сохранив в другом списке, и повторить 25 раз.Затем вам пришлось бы снова поместить эти элементы обратно!
Возможно, вы захотите взглянуть на Карта индексированного дерева в индексированная древовидная карта
Используйте exact(size-25), чтобы получить доступ к элементу по индексу без итерации.
Поместите набор в список и используйте subList().Я не уверен, насколько эффективно создавать Список, поэтому вам придется выполнить несколько тестов.Хотя это, безусловно, упростило бы кодирование.
List f = new ArrayList( summaries);
List lastTwentyFive = f.subList( summaries.size() - 25, summaries.size() );
Я предполагаю, что это вряд ли будет иметь какое-либо реальное применение в вашем проекте, но стоит отметить, что вместо этого вы могли бы просто отсортировать список в противоположном направлении :)