Comment pourrais-je détecter (renvoyer vrai / faux) si une ArrayList contient plusieurs éléments du même élément en Java?
Merci beaucoup, Terry
Edit Oublié de mentionner que je ne cherche pas à comparer les "blocs" entre eux mais leurs valeurs entières. Chaque "bloc" a un int et c'est ce qui les rend différents. Je trouve l'int d'un bloc particulier en appelant une méthode nommée "getNum" (par exemple table1 [0] [2] .getNum ();
Réponses:
Le plus simple: vider toute la collection dans un Set (en utilisant le constructeur Set (Collection) ou Set.addAll), puis voir si le Set a la même taille que ArrayList.
Mise à jour: si je comprends bien votre question, vous avez un tableau 2D de Block, comme dans
Table de bloc [] [];
et vous voulez détecter si une ligne d'entre eux a des doublons?
Dans ce cas, je pourrais faire ce qui suit, en supposant que Block implémente correctement "equals" et "hashCode":
Je ne suis pas sûr à 100% de cela pour la syntaxe, il serait donc plus sûr de l'écrire sous la forme
Set.add
renvoie un booléen false si l'élément en cours d'ajout est déjà dans l'ensemble, vous pouvez donc même court-circuiter et expulser tout ajout qui retournefalse
si tout ce que vous voulez savoir est s'il y a des doublons.la source
Code amélioré, utilisant la valeur de retour de
Set#add
au lieu de comparer la taille de la liste et de l'ensemble.la source
Set<T> set = new HashSet<T>(list.size());
? Étant donné un paramètre de liste, je pense qu'il est plus efficace s'il est courant que la liste ne contienne pas de doublons.HashSet
à la taille de la liste entraînera un redimensionnement lors de l'exécution de la liste entière en raison du facteur de chargement sous-jacent de la structure de hachage.Si vous cherchez à éviter du tout les doublons, vous devez simplement couper le processus intermédiaire de détection des doublons et utiliser un ensemble .
la source
Code amélioré pour renvoyer les éléments en double
la source
Si vos éléments sont en quelque sorte comparables (le fait que l'ordre ait une signification réelle est indifférent - il doit juste être cohérent avec votre définition de l'égalité), la solution de suppression des doublons la plus rapide va trier la liste (0 (n log ( n))) puis pour faire une seule passe et chercher des éléments répétés (c'est-à-dire des éléments égaux qui se succèdent) (c'est O (n)).
La complexité globale va être O (n log (n)), ce qui est à peu près la même chose que ce que vous obtiendriez avec un ensemble (n fois long (n)), mais avec une constante beaucoup plus petite. En effet, la constante de tri / dédup résulte du coût de comparaison des éléments, alors que le coût de l'ensemble est le plus susceptible de résulter d'un calcul de hachage, plus une (éventuellement plusieurs) comparaisons de hachage. Si vous utilisez une implémentation de Set basée sur le hachage, c'est parce qu'une arborescence va vous donner un O (n log² (n)), ce qui est encore pire.
Si je comprends bien, cependant, vous n'avez pas besoin de supprimer les doublons, mais simplement de tester leur existence. Vous devez donc coder à la main un algorithme de fusion ou de tri de tas sur votre tableau, qui sort simplement en retournant true (c'est-à-dire "il y a un dup") si votre comparateur renvoie 0, et sinon termine le tri, et traverse le tableau trié testant les répétitions . Dans un tri par fusion ou par tas, en effet, lorsque le tri est terminé, vous aurez comparé chaque paire en double à moins que les deux éléments ne soient déjà dans leur position finale (ce qui est peu probable). Ainsi, un algorithme de tri modifié devrait apporter une énorme amélioration des performances (je devrais le prouver, mais je suppose que l'algorithme modifié devrait être dans le O (log (n)) sur des données uniformément aléatoires)
la source
J'avais besoin de faire une opération similaire pour un
Stream
, mais je n'ai pas pu trouver un bon exemple. Voici ce que j'ai trouvé.Cela a l'avantage de court-circuiter lorsque les doublons sont trouvés tôt plutôt que de devoir traiter l'ensemble du flux et n'est pas beaucoup plus compliqué que de simplement tout mettre dans un
Set
et de vérifier la taille. Donc, ce cas serait à peu près:la source
Avec Java 8+, vous pouvez utiliser l'API Stream:
la source
En termes simples: 1) assurez-vous que tous les éléments sont comparables 2) triez le tableau 2) parcourez le tableau et trouvez les doublons
la source
Pour connaître les doublons dans une liste, utilisez le code suivant: Il vous donnera l'ensemble qui contient les doublons.
la source
La meilleure façon de gérer ce problème est d'utiliser un HashSet :
Imprimez simplement la liste des résultats et voyez le résultat sans doublons :)
la source
Si vous voulez le jeu de valeurs en double:
Et pensez probablement aussi à rogner les valeurs ou à utiliser des minuscules ... selon votre cas.
la source
Remarque: cela aura un impact majeur sur les performances car les éléments sont supprimés du début de la liste. Pour résoudre ce problème, nous avons deux options. 1) itérer dans l'ordre inverse et supprimer des éléments. 2) Utilisez LinkedList au lieu de ArrayList. En raison des questions biaisées posées lors des entretiens pour supprimer les doublons de la liste sans utiliser aucune autre collection, l'exemple ci-dessus est la réponse. Dans le monde réel cependant, si je dois y parvenir, je mettrai des éléments de liste à ensemble, simple!
la source
Un exemple de classe concrète qui a été substituée
equals()
:la source
la source
Cette réponse est écrite en Kotlin, mais peut facilement être traduite en Java.
Si la taille de votre arraylist est dans une petite plage fixe, alors c'est une excellente solution.
la source
la source