Je suis déconcerté de ne pas pouvoir trouver une réponse rapide à cette question. Je suis essentiellement à la recherche d'une structure de données en Java qui implémente la fonction java.util.List
mais qui stocke ses membres dans un ordre trié. Je sais que vous pouvez utiliser une interface normale ArrayList
et utiliser Collections.sort()
mais j'ai un scénario où j'ajoute occasionnellement et récupère souvent des membres de ma liste et je ne veux pas avoir à la trier à chaque fois que je récupère un membre au cas où un nouveau membre a été ajouté. Quelqu'un peut-il m'indiquer une telle chose qui existe dans le JDK ou même dans des bibliothèques tierces ?
EDIT : La structure de données devra préserver les doublons.
SOMMAIRE DE LA RÉPONSE : J'ai trouvé tout cela très intéressant et j'ai appris beaucoup de choses. Aioobe en particulier mérite une mention pour sa persévérance à essayer de réaliser mes exigences ci-dessus (principalement une implémentation triée de java.util.List qui supporte les doublons). J'ai accepté sa réponse comme étant la plus précise par rapport à ce que j'ai demandé et celle qui m'a le plus fait réfléchir sur les implications de ce que je cherchais, même si ce que j'ai demandé 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 dans le concept de méthodes optionnelles dans une interface. Pour citer la javadoc :
L'utilisateur de cette interface a un contrôle précis de l'endroit où chaque élément est inséré dans la liste.
L'insertion dans une liste triée ne permet pas un contrôle précis du point d'insertion. Ensuite, vous devez réfléchir à la manière dont vous allez gérer certaines méthodes. Prenons l'exemple de add
par exemple :
public boolean add(Object o)
Appends the specified element to the end of this list (optional operation).
Vous vous retrouvez alors dans une situation inconfortable où vous devez soit 1) rompre le contrat et mettre en œuvre une version triée d'add 2) Laisser add
ajouter un élément à la fin de la liste, brisant ainsi l'ordre de tri. 3) Sortir add
(car il est optionnel) en lançant un UnsupportedOperationException
et en implémentant une autre méthode qui ajoute les éléments dans un ordre trié.
L'option 3 est probablement la meilleure, mais je trouve déplaisant d'avoir une méthode add qu'on ne peut pas utiliser et une autre méthode sortedAdd qui n'est pas dans l'interface.
Autres solutions connexes (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 section
add(Object obj)
et bizarrement a une méthode sans effet pouradd(int index, Object obj)
. Le consensus général suggèrethrow new UnsupportedOperationException()
pourrait être un meilleur choix dans ce scénario. - Le TreeMultiSet de Guava Une implémentation d'ensemble qui supporte les doublons
-
ca.odell.glazedlists.SortedList Cette classe est accompagnée d'un avertissement dans sa javadoc :
Warning: This class breaks the contract required by List
4 votes
Si vous insérez occasionnellement et lisez fréquemment, pourquoi ne pas simplement trier pendant l'insertion ?