Je suis déconcerté de ne pas trouver de réponse rapide à cela. Je recherche essentiellement une structure de données en Java qui implémente l' java.util.List
interface, mais qui stocke ses membres dans un ordre trié. Je sais que vous pouvez utiliser un normal ArrayList
et l'utiliser Collections.sort()
dessus, mais j'ai un scénario dans lequel j'ajoute et récupère souvent des membres de ma liste et je ne veux pas avoir à le trier à chaque fois que je récupère un membre au cas où un un nouveau a été ajouté. Quelqu'un peut-il me diriger vers une telle chose qui existe dans le JDK ou même des bibliothèques tierces?
EDIT : La structure de données devra conserver les doublons.
RÉSUMÉ DE RÉPONSE : J'ai trouvé tout cela très intéressant et j'ai beaucoup appris. Aioobe en particulier mérite d'être mentionné pour sa persévérance à essayer de répondre à mes exigences ci-dessus (principalement une implémentation triée de java.util.List qui prend en charge les doublons). J'ai accepté sa réponse comme étant la plus précise pour ce que j'ai demandé et la plupart des réflexions sur les implications de ce que je cherchais même si ce que je demandais n'était pas exactement ce dont j'avais besoin.
Le problème avec ce que j'ai demandé réside dans l'interface List elle-même et le concept de méthodes optionnelles dans une interface. Pour citer le javadoc:
L'utilisateur de cette interface a un contrôle précis sur l'endroit où dans la liste chaque élément est inséré.
L'insertion dans une liste triée n'a pas de contrôle précis sur le point d'insertion. Ensuite, vous devez réfléchir à la manière dont vous allez gérer certaines des méthodes. Prenons add
par exemple:
public boolean add (objet o)
Appends the specified element to the end of this list (optional operation).
Vous vous retrouvez maintenant dans la situation inconfortable de 1) Rompre le contrat et implémenter une version triée de l'add 2) Laisser add
ajouter un élément à la fin de la liste, briser votre ordre trié 3) Oublier add
(comme facultatif) en lançant an UnsupportedOperationException
et implémentant une autre méthode qui ajoute des éléments dans un ordre trié.
L'option 3 est probablement la meilleure, mais je trouve qu'il est peu recommandable d'avoir une méthode add que vous ne pouvez pas utiliser et une autre méthode sortedAdd qui n'est pas dans l'interface.
Autres solutions associées (sans ordre particulier):
- java.util.PriorityQueue qui est probablement plus proche de ce dont j'avais besoin que de ce que j'ai demandé. Une file d'attente n'est pas la définition la plus précise d'une collection d'objets dans mon cas, mais fonctionnellement, elle fait tout ce dont j'ai besoin.
- net.sourceforge.nite.util.SortedList . Cependant, cette implémentation rompt le contrat de l'interface List en implémentant le tri dans la
add(Object obj)
méthode et a bizarrement une méthode sans effetadd(int index, Object obj)
. Le consensus général suggèrethrow new UnsupportedOperationException()
que ce serait un meilleur choix dans ce scénario. - TreeMultiSet de Guava Une implémentation d'ensemble qui prend en charge les doublons
- ca.odell.glazedlists.SortedList Cette classe est accompagnée de la mise en garde dans son javadoc:
Warning: This class breaks the contract required by List