Question

En Java je SortedSet qui peut avoir 100.000 éléments. Je voudrais obtenir efficacement et avec élégance les 25 derniers éléments. Je suis un peu perplexe.

Pour obtenir le premier 25 J'itérer et aurait arrêt après 25 éléments. Mais je ne sais pas comment itérer dans l'ordre inverse. Toutes les idées?

SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
Était-ce utile?

La solution

Vous avez besoin d'un NavigableSet. Sinon vous devrez le faire inefficacement, itérer l'ensemble SortedSet et la collecte des éléments dans un Queue que vous continuiez parés à 25 éléments.

Autres conseils

SortedSet<T> a été conçu en supposant un modèle d'itération très simple, avant que, trouvant ainsi les premières entrées n est facile, mais trouver la dernière nécessiterait une lecture coûteuse par l'itérateur maintenant une fenêtre des entrées de dernière n.

NavigableSet<T> ajoutant à 1,6 résout ce (et la seule mise en œuvre de SortedSet 1.4 TreeSet met en œuvre il est donc susceptible d'être une baisse de remplacement pour vous).

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

Inverser votre tri et de prendre les 25 premiers éléments. Vous pouvez alors inverser ceux qui seront efficaces que ses seulement 25 points.

Bruce

Une autre structure de données serait plus approprié pour cette opération.

Ce n'est pas une façon élégante ou très efficace , mais en supposant que le SortedSet est dans l'ordre croissant, vous pouvez obtenir l'élément Last () et retirez-le, le stocker dans une autre liste, et répétez 25 fois . Vous devrez alors mettre ces éléments à nouveau!

Vous pouvez jeter un oeil à href="https://github.com/geniot/indexed-tree-map" rel="nofollow noreferrer">-tree-plan indexé

Utilisez exacte (taille 25) pour se rendre à l'élément à l'index sans itération.

Jeter l'ensemble dans une liste et utiliser subList (). Je ne sais pas comment il est performant pour créer la liste, de sorte que vous auriez à faire quelques tests. Ce serait certainement faire le codage facile cependant.

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

Je suppose que cela est peu probable de toute utilisation de la vie réelle dans votre projet, mais il est intéressant de noter que vous pouvez simplement être en mesure d'avoir la liste triée dans le sens opposé à la place:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top