4 votes

Existe-t-il un moyen de créer une liste/un ensemble qui conserve l'ordre d'insertion et n'autorise pas les doublons en Java ?

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 ?

10voto

Thomas Points 35713

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>());

0voto

Tom Anderson Points 22456

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.

-1voto

tokam Points 1007

Il suffit d'utiliser un TreeSet .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X