Como obter os últimos 25 elementos de um SortedSet?
Pergunta
Em Java Eu tenho um SortedSet que pode ter 100.000 elementos. Eu gostaria de obter de forma eficiente e elegantemente os últimos 25 elementos. Estou um pouco confuso.
Para obter o início 25 eu iterar e parada depois de 25 elementos. Mas eu não sei como iterar em ordem inversa. Alguma idéia?
SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
Solução
Você precisa de um NavigableSet
. Então você vai ter que fazer isso de forma ineficiente, interagindo através de todo o SortedSet
e coleta de elementos em um Queue
que você mantenha aparada a 25 elementos.
Outras dicas
SortedSet<T>
foi projetado assumindo um modelo de iteração muito simples, apenas para a frente, assim, encontrar a parte superior n entradas é fácil, mas encontrar o último exigiria uma leitura caro através do iterador manter uma janela das entradas últimos n.
NavigableSet<T>
adição em 1,6 resolve isto (e a única implementação SortedSet de 1,4 implementos TreeSet-lo por isso é provável que seja uma gota de substituição para você).
NavigableSet<T> set = new TreeSet<T>();
// add elements
set.descendingIterator() // iterate over the last n entires as needed
inverter a sua sorte e tomar os primeiros 25 itens. Você pode então reverter os que será eficiente como seus apenas 25 itens.
Bruce
A estrutura de dados diferente seria mais apropriado para esta operação.
Isto não é uma maneira elegante ou muito eficiente , mas assumindo o SortedSet está em ordem crescente você poderia obter o item Last () e removê-lo, armazená-lo em uma outra lista, e repita 25 vezes . Você, então, tem que colocar esses elementos de volta!
Você pode querer dar uma olhada em IndexedTreeMap em indexada-árvore-map
Use exata (tamanho 25) para chegar ao elemento no índice sem iteração.
Lance o conjunto em uma lista e uso subList (). Eu não estou certo de como PERFORMANT é para criar a lista, então você teria que fazer alguns testes. Certamente faria a codificação fácil embora.
List f = new ArrayList( summaries);
List lastTwentyFive = f.subList( summaries.size() - 25, summaries.size() );
Estou assumindo que este é improvável que seja de qualquer uso da vida real em seu projeto, mas é importante notar que você pode simplesmente ser capaz de ter a lista ordenada na direção oposta em vez disso:)