Как получить последние 25 элементов SortedSet?

StackOverflow https://stackoverflow.com/questions/581677

  •  06-09-2019
  •  | 
  •  

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top