Domanda

In Java ho un SortedSet che può avere 100.000 elementi. Vorrei ottenere in modo efficiente e con eleganza gli ultimi 25 elementi. Sono un po 'perplesso.

Per ottenere il prima 25 mi piacerebbe Itera e fermare dopo 25 elementi. Ma io non so come iterare in ordine inverso. Tutte le idee?

SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
È stato utile?

Soluzione

Hai bisogno di una NavigableSet. Altrimenti dovrete farlo in modo inefficiente, scorrendo l'intero SortedSet e la raccolta di elementi in un Queue che si continua a rifilato a 25 elementi.

Altri suggerimenti

SortedSet<T> creata ipotizzando un modello molto semplice iterazione, solo avanti, trovando così le voci n top è facile ma trovare l'ultimo richiederebbe una lettura costoso attraverso l'iteratore mantenere una finestra delle voci ultimi n.

NavigableSet<T> aggiungendo 1,6 risolve questo (e l'unica implementazione SortedSet da 1,4 TreeSet implementa quindi è probabile che sia un rimpiazzo per voi).

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

Reverse l'ordinamento e prendere i primi 25 articoli. È quindi possibile invertire quelle che saranno efficienti come i suoi soli 25 elementi.

Bruce

Una struttura di dati differente sarebbe più appropriato per questa operazione.

Questo non è un modo elegante o molto efficiente , ma supponendo che il SortedSet è in ordine crescente si potrebbe ottenere l'ultimo elemento () e rimuoverlo, riporlo in un altro elenco, e ripetere 25 volte . Si sarebbe quindi dovuto mettere di nuovo questi elementi!

Si consiglia di dare un'occhiata a IndexedTreeMap in indicizzati-tree-map

Utilizzare esatta (size-25) per ottenere l'elemento a indice senza iterazione.

Gettare il set in un elenco e utilizzare sottoelenco (). Io non sono sicuro di come performante sia per creare l'elenco, in modo che avrebbe dovuto eseguire alcuni test. Sarebbe certamente rendere la codifica facile però.

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

sto supponendo che questo è improbabile che sia di qualche utilità nella vita reale nel progetto, ma vale la pena notare che si potrebbe semplicemente essere in grado di avere l'elenco ordinato in senso contrario invece:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top