Quelle est la manière la plus efficace de maintenir une liste qui n'autorise pas les doublons, mais qui conserve l'ordre d'insertion et permet également de récupérer le dernier élément inséré en Java ?
Réponses
Trop de publicités?Pruebe LinkedHashSet qui conserve l'ordre d'entrée.
Notez que la réinsertion d'un élément mettrait à jour sa position dans l'ordre d'entrée, vous pouvez donc d'abord essayer de vérifier si l'élément est déjà contenu dans l'ensemble.
Editer :
Vous pouvez également essayer la classe de collections Apache commons ListOrderedSet qui, d'après la JavaDoc (si je n'ai pas encore mal lu :) ), décore un ensemble afin de conserver l'ordre d'insertion et fournit une fonction get(index)
méthode.
Il semble donc que vous puissiez obtenir ce que vous voulez en utilisant new ListOrderedSet(new HashSet())
;
Malheureusement, cette classe ne fournit pas de paramètre générique, mais cela peut vous aider à démarrer.
Editer 2 :
Voici un projet qui semble représenter les collections de communs avec des génériques, c'est-à-dire qu'il a une fonction ListOrderedSet<E>
et vous pouvez donc, par exemple, appeler new ListOrderedSet<String>(new HashSet<String>());
Je ne pense pas qu'il y ait quoi que ce soit dans le JDK qui fasse cela.
H LinkedHashMap qui sert de base à LinkedHashSet, s'en rapproche : il maintient une liste circulaire doublement liée des entrées de la carte. Il ne suit que la tête de la liste et non la queue, mais parce que la liste est circulaire, header.before
est la queue (l'élément le plus récemment inséré).
Vous pouvez donc mettre en œuvre ce dont vous avez besoin en plus de cela. LinkedHashMap n'a pas été conçu pour être étendu, ce qui est quelque peu gênant. Vous pouvez copier le code dans votre propre classe et ajouter un élément last()
(attention aux problèmes de licence), ou vous pouvez étendre la classe existante et ajouter une méthode qui utilise la réflexion pour accéder à la méthode privée header
y before
champs.
Vous obtiendrez ainsi une carte plutôt qu'un ensemble. Cependant, il n'y a pas d'autre solution, HashSet est déjà une enveloppe qui fait ressembler une Map à un Set. Encore une fois, il n'est pas conçu pour une extension générale, mais vous pourriez écrire une sous-classe dont le constructeur appelle le super constructeur, puis utilise plus de réflexion pour remplacer la valeur de map
avec une instance de votre nouvelle carte. À partir de là, la classe devrait faire exactement ce que vous voulez.
Soit dit en passant, les cours de bibliothéconomie ont tous été rédigés par Josh Bloch et Neal Gafter. Ces deux hommes sont deux des géants de Java. Et pourtant, le code qui s'y trouve est en grande partie horrible. Ne rencontrez jamais vos héros.