Pregunta

En Java Tengo un SortedSet que puede tener 100.000 elementos. Me gustaría obtener de manera eficiente y elegante de los últimos 25 elementos. Estoy un poco desconcertado.

Para obtener el primero 25 me gustaría Iterar y se detienen después de 25 elementos. Pero no sé la forma de repetición en el orden inverso. ¿Alguna idea?

SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
¿Fue útil?

Solución

Es necesario un NavigableSet. De lo contrario tendrá que hacerlo de manera ineficiente, iteración a través de toda la SortedSet y la recolección de elementos en un Queue que usted guarda recortado a 25 elementos.

Otros consejos

SortedSet<T> fue diseñado asumiendo un modelo de repetición muy simple, sólo hacia adelante, encontrando así las entradas superior n es fácil, pero encontrar el último requeriría una lectura a través de la cara iterador mantener una ventana de las entradas últimos n.

NavigableSet<T> adición en 1,6 resuelve esto (y la única aplicación SortedSet de 1,4 TreeSet implementa por lo que es probable que sea una gota en el reemplazo para usted).

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

Invertir el tipo y dar los primeros 25 artículos. A continuación, puede revertir los que puedan estar eficiente ya que está a 25 elementos.

Bruce

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

Esto no es una elegante manera u muy eficiente , 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 . A continuación, tendría que poner estos elementos de nuevo!

Es posible que desee echar un vistazo a en href="https://github.com/geniot/indexed-tree-map" rel="nofollow noreferrer">-indexado árbol de ruta

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

Tire el conjunto en una lista y utilizar subLista (). No estoy seguro de cómo performant que es crear la lista, por lo que tendría que hacer algunas pruebas. Sin duda haría que la codificación fácil sin embargo.

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

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 su lugar:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top