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 :-(
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top