2010-11-28 3 views
2

У меня есть SortedSet (в частности, TreeSet), содержащий обновления. Обновление что-то вроде SVN совершить, Facebook стены пост, новый Trac билет и т.д. Я храню их в SortedSet, потому что:Обрезка отсортированного набора

  • Сортировка: Обновления должны быть отсортированы по дате, по убыванию.
  • Set: При получении последних обновлений из источника обновлений я обычно получаю обновления, которые уже находятся в наборе.

Теперь, через некоторое время набор будет расти очень огромным, поэтому я хотел бы удалить все, кроме первых X элементов из набора (потому что другие не будут отображаться в любом случае). Как я могу это сделать, так как это не List?

ответ

4
While(mySet.size() > limit) { 
    mySet.remove(mySet.last()); 
} 
+0

Я не знаю о производительности, что по сравнению к моему обходному пути, но это не имеет большого значения. Это очень легко читать – 2010-11-28 13:43:11

+0

Это не делает атомарно. Мне нужна аналогичная вещь, но сделано атомарно – Wins 2015-08-25 08:16:16

0

свой обходной путь является:

 List<Update> trimmed = new ArrayList<Update>(20); 
     int i = 0; 
     for (Update u : updates) { 
      trimmed.add(u); 
      i++; 
      if (i > 20) break; 
     } 
     updates = new TreeSet<Update>(trimmed); 
1

Решение здесь должно зависеть от того, нужно ли «лишние» данные в будущем. Если вам нужно ваше решение на основе дополнительного списка, это нормально. Если нет, я предлагаю следующее:

Создайте свой собственный сортированный набор, который расширяет java.util.SortedSet и переопределяет его метод add(). Этот метод не должен ничего делать после определенного предела. В качестве альтернативы вы можете создать «обертку», которая содержит набор полезной нагрузки и делегирует все методы, кроме add(). Метод add() должен делегировать свой вызов только в том случае, если размер полезной нагрузки меньше предопределенного предела. Вот как работает FixedSizeSortedMap рамок коллекции jakarta, поэтому вы можете просто использовать его.

0

Вот метод рабочего раствора для Java, учитывая TreeSet результатов и переменной размера заданием размера результирующего набора:

void setLimit(Set<T> resutls, int size) { 
    List<T> items = new ArrayList<T>(); 
    items.addAll(resutls); 
    resutls.clear(); 
    int trim = size>items.size() ? items.size() : size; 
    resutls.addAll(items.subList(0,trim)); 
    // return results; // optionally, if required 
} 
Смежные вопросы