Trouver des entrées en double dans la Collection
Est-il un outil ou à la bibliothèque pour trouver les doublons dans une Collection selon des critères spécifiques qui peuvent être mises en œuvre?
À me faire comprendre: je veux comparer les entrées les uns aux autres selon des critères spécifiques. Je crois donc que Predicate
retour juste true
ou false
n'est pas suffisant.
Je ne peux pas utiliser equals
.
De quelle façon aimeriez-vous préciser la déduplication des critères? Comme un prédicat binaire?
Voulez-vous trouver les doublons, ou supprimer?
En fait, il suffisait juste de savoir si il y a des doublons.
Parlez - ah, alors vous pouvez simplement comparer la taille de la collection résultant de Samuel Rossille, la réponse à la taille de la collection d'origine.
Veuillez voir mon édité question.
Voulez-vous trouver les doublons, ou supprimer?
En fait, il suffisait juste de savoir si il y a des doublons.
Parlez - ah, alors vous pouvez simplement comparer la taille de la collection résultant de Samuel Rossille, la réponse à la taille de la collection d'origine.
Veuillez voir mon édité question.
OriginalL'auteur | 2012-05-25
Vous devez vous connecter pour publier un commentaire.
Il dépend de la sémantique de l'critère:
Si votre critère est toujours le même pour une classe donnée, et est inhérente à la notion sous-jacente, vous devriez mettre en œuvre
equals
ethashCode
et l'utilisation d'un ensemble.Si votre critère dépend du contexte, org.apache.commons.les collections.CollectionUtils.sélectionnez(java.util.Collection, org.apache.commons.les collections.Prédicat) pourrait être la bonne solution pour vous.
OriginalL'auteur Samuel Rossille
Si vous voulez trouver doublons, plutôt que de simplement les enlever, une approche pourrait être de lancer la Collection dans un tableau, trier le tableau par l'intermédiaire d'un Comparateur qui implémente vos critères, puis de façon linéaire à pied à travers la matrice, à la recherche de doubles adjacentes.
Voici un croquis (pas testé):
Edit: De votre commentaire, vous voulez juste savoir si il y sont les doublons. L'approche ci-dessus fonctionne pour cela aussi. Mais vous pouvez plus simplement, il suffit de créer un projet java.util.SortedSet avec un Comparateur. Voici un croquis:
OriginalL'auteur Andy Thomas
Vous pouvez adapter un jeu Java pour la recherche de doublons parmi les objets d'un type arbitraire: l'enveloppe de votre cible, à un cours privé wrapper qui évalue l'égalité en fonction de vos critères, et de construire un ensemble de papiers d'emballage.
Ici est un peu long exemple qui illustre cette technique. Il considère deux personnes avec le même prénom à l'égalité, et de sorte qu'il détecte trois copies dans le tableau de cinq objets.
Vous pouvez jouer avec cet exemple sur ideone [lien].
Si votre fonction de hachage est bonne, l'efficacité est la même qu'avec toute table de hachage, ce qui est
O(1)
pour chaque élément, ouO(N)
pour l'ensemble de la collection.dasblinkenlight: je suis un peu préoccupé par l'écharpe de création de l'objet, même si je sais qu'ils seront partis en dehors de la boucle.
Java est très efficace à la création de petits objets (et que ces objets sont minuscules). Malheureusement, Java ne dispose pas d'un concept parallèle .NET comparateur d'égalité - qui permettrait de trouver une solution qui évite temporaire des objets tout à fait.
OriginalL'auteur dasblinkenlight
Vous pouvez utiliser une carte et lors de l'itération sur la collecte de mettre les éléments dans la carte (les prédicats constitueraient les principaux) et si il y a déjà une entrée que vous avez trouvé un duplicata.
Pour plus d'informations, voir ici: Trouver les doublons dans une collection
OriginalL'auteur Thomas
J'ai créé une nouvelle interface semblable à la
IEqualityComparer<T>
interface dans .NET.Une telle
EqualityComparator<T>
je puis passez à la méthode suivante qui détecte les doublons.Cette façon, je peux personnaliser le rapport à mes besoins.
OriginalL'auteur
Treeset vous permet de faire cela facilement:
yourComarator
est utilisé lors de l'appel deuniqueItems.add(o)
, qui ajoute l'élément à l'ensemble et retournetrue
si l'élément est unique. Si le comparateur considère que l'élément est un doublon,add(o)
retournera false.Noter que l'élément
equals
méthode doit être cohérente avecyourComarator
comme par le TreeSet documentation pour que cela fonctionne.OriginalL'auteur Tadhg
De réitérer la
ArrayList
qui contient des doublons et de les ajouter à laHashSet
. Lorsque le complément de la méthode renvoie false dans leHashSet
connectez-vous tout simplement le double de la console.equals()
. UnHashSet
utilisehashCode()
etequals()
. Il ne peut donc pas utiliser unHashSet
.OriginalL'auteur Nagendra