2009-02-24 15 views
9

En Java tengo un SortedSet que puede tener 100,000 elementos. Me gustaría obtener de manera eficiente y elegante los últimos 25 elementos. Estoy un poco desconcertado.¿Cómo obtener los últimos 25 elementos de un SortedSet?

Para obtener el primero 25 iteraría y me detendría después de 25 elementos. Pero no sé cómo iterar en orden inverso. ¿Algunas ideas?

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

Un conjunto ordenado ... Qué oxímoron. –

+0

Anton Gogolev: consulte el artículo "Orden total" de Wikipedia. – kmkaplan

Respuesta

14

Necesita NavigableSet. De lo contrario, tendrá que hacerlo de manera ineficiente, iterando a través de SortedSet y recopilando elementos en un Queue que mantiene recortado en 25 elementos.

+0

NavigableSet fue agregado a Java 6. ¡Convenientemente, actualicé mi base de código de Java 5 a Java 6 la semana pasada! –

+0

+1. definitivamente el camino a seguir! –

1

Una estructura de datos diferente sería más apropiada para esta operación.

Esto no es una elegante manera muy eficiente o, pero asumiendo la SortedSet está en orden ascendente se puede obtener el artículo pasado() y retirarlo, almacenándolo en otra lista, y repetir 25 veces. ¡Entonces tendrías que volver a poner estos elementos!

4

SortedSet <T> se diseñó asumiendo un modelo de iteración muy simple, solo reenviar, encontrando las primeras n entradas es fácil pero encontrar el último requeriría una lectura costosa a través del iterador manteniendo una ventana de las últimas n entradas.

NavigableSet<T> añadiendo en 1.6 resuelve esto (y la única implementación SortedSet de 1.4 TreeSet lo implementa por lo que es probable que sea un reemplazo en su reemplazo).

NavigableSet<T> set = new TreeSet<T>(); 
// add elements 
set.descendingIterator() // iterate over the last n entires as needed 
+1

Esta respuesta confunde la parte superior de un b-tree con el primer elemento secuencial que contiene: no son lo mismo. Debe corregirse para evitar votos abajo porque de lo contrario es una respuesta correcta. –

+0

El problema esencial con las colecciones pre J6 es la navegación unidireccional (solo hacia adelante). –

+0

corregido, avíseme si cree que esto no está claro gracias – ShuggyCoUk

0

Estoy asumiendo que esto es poco probable que sea de alguna utilidad en la vida real en su proyecto, pero vale la pena señalar que es posible que simplemente ser capaz de tener la lista ordenada en la dirección opuesta en vez :)

0

¿Lanzar el conjunto a una lista y usar subList()? No estoy seguro de qué tan eficiente es crear la Lista, por lo que tendrías que ejecutar algunas pruebas. Sin duda, haría la codificación fácil. \

List f = new List(summaries); 
    List lastTwentyFive = f.subList(summaries.size() - 25, summaries.size()); 
3

Invierta su orden y tome los primeros 25 elementos. A continuación, puede revertir aquellos que serán eficientes ya que son solo 25 elementos.

Bruce

1

Es posible que desee echar un vistazo a IndexedTreeMap en indexed-tree-map

Uso exacta (tamaño 25) para llegar al elemento en el índice sin iteración.

Cuestiones relacionadas