J'ai un ArrayList<String>
, et je veux en supprimer les chaînes répétées. Comment puis-je faire ceci?
java
list
collections
arraylist
duplicates
user25778
la source
la source
public Set<Object> findDuplicates(List<Object> list) { Set<Object> items = new HashSet<Object>(); Set<Object> duplicates = new HashSet<Object>(); for (Object item : list) { if (items.contains(item)) { duplicates.add(item); } else { items.add(item); } } return duplicates; }
List
etSet
(au lieu des types d'implémentationArrayList
etHashSet
comme dans votre exemple).new HashSet(al)
au lieu de l'initialiser à vide et en appelantaddAll
.Object
a plusieurs valeurs si deux d'entre elles se répètent, je les considère comme des doublons (d'autres valeurs peuvent être différentes) et j'utiliseSet
?Bien que la conversion
ArrayList
en unHashSet
supprime efficacement les doublons, si vous devez conserver l'ordre d'insertion, je vous suggère plutôt d'utiliser cette varianteEnsuite, si vous avez besoin de récupérer une
List
référence, vous pouvez réutiliser le constructeur de conversion.la source
En Java 8:
Veuillez noter que le contrat hashCode-equals pour les membres de la liste doit être respecté pour que le filtrage fonctionne correctement.
la source
addAll
fairenew TreeSet<String>(String.CASE_INSENSITIVE_ORDER)
. Le premier élément ajouté restera dans l'ensemble, donc si votre liste contient "Chien" et "chien" (dans cet ordre),TreeSet
il contiendra "Chien". Si l'ordre doit être préservé, alors avant la ligne de la réponse, mettezlist.replaceAll(String::toUpperCase);
.Supposons que nous ayons une liste
String
comme:Ensuite, nous pouvons supprimer les éléments en double de plusieurs manières.
Avant Java 8
Remarque: Si nous voulons conserver l'ordre d'insertion, nous devons utiliser
LinkedHashSet
à la place deHashSet
Utiliser la goyave
Utilisation de Java 8
Remarque: Si nous voulons collecter le résultat dans une implémentation de liste spécifique,
LinkedList
nous pouvons par exemple modifier l'exemple ci-dessus comme suit:Nous pouvons
parallelStream
également l' utiliser dans le code ci-dessus, mais il peut ne pas offrir les avantages attendus en termes de performances. Consultez cette question pour en savoir plus.la source
parallel streams
donnera toujours de meilleures performances. Mais c'est un mythe. J'ai appris plus tard qu'il existe certains scénarios dans lesquels des flux parallèles doivent être utilisés. Dans ce scénario, les flux parallèles ne donneront pas de meilleures performances. et oui les flux parallèles peuvent ne pas donner les résultats souhaités dans certains cas.List<String> deDupStringList3 = stringList.stream().map(String::toLowerCase).distinct().collect(Collectors.toList());
devrait être la solution appropriée dans ce casSi vous ne voulez pas de doublons, utilisez un ensemble au lieu d'un
List
. Pour convertir unList
en un,Set
vous pouvez utiliser le code suivant:Si vraiment nécessaire, vous pouvez utiliser la même construction pour convertir un
Set
dos en unList
.la source
Set
Ne peut donc pas être utilisé ici.Vous pouvez également le faire de cette façon et préserver l'ordre:
la source
Les flux Java 8 offrent un moyen très simple de supprimer les éléments en double d'une liste. En utilisant la méthode distincte. Si nous avons une liste de villes et que nous voulons supprimer les doublons de cette liste, cela peut être fait sur une seule ligne -
Comment supprimer des éléments en double d'une liste d'arrayl
la source
Voici un moyen qui n'affecte pas l'ordre de votre liste:
l1 est la liste d'origine et l2 est la liste sans éléments répétés (assurez-vous que YourClass a la méthode equals selon ce que vous voulez représenter pour l'égalité)
la source
ArrayList<T>
doivent être utilisés à la place deArrayList
) 2) La création explicite d'itérateur peut être évitée en utilisant afor (T current : l1) { ... }
. Même si vous vouliez utiliserIterator
explicitement,iterador
est mal orthographié.Il est possible de supprimer les doublons de l'arraylist sans utiliser HashSet ou un autre arraylist .
Essayez ce code ..
La sortie est
la source
ImmutableSet.copyOf(lst).toList()
.indexOf
itère l'lst
utilisation d'une boucle for.Il y a aussi
ImmutableSet
de Guava en option ( voici la documentation):la source
ImmutableSet.asList()
méthode, renvoyant unImmutableList
, si vous en avez besoin en tant queList
.cela peut résoudre le problème:
la source
Probablement un peu exagéré, mais j'aime ce genre de problème isolé. :)
Ce code utilise un ensemble temporaire (pour la vérification de l'unicité) mais supprime les éléments directement dans la liste d'origine. Étant donné que la suppression d'éléments à l'intérieur d'une ArrayList peut induire une énorme quantité de copie de tableau, la méthode remove (int) est évitée.
Pendant que nous y sommes, voici une version pour LinkedList (beaucoup plus agréable!):
Utilisez l'interface de marqueur pour présenter une solution unifiée pour List:
EDIT: Je suppose que les trucs génériques n'ajoutent pas vraiment de valeur ici .. Oh bien. :)
la source
la source
Si vous souhaitez utiliser une bibliothèque tierce, vous pouvez utiliser la méthode
distinct()
dans Eclipse Collections (anciennement GS Collections).L'avantage d'utiliser
distinct()
au lieu de convertir en un ensemble puis de revenir à une liste est qu'ildistinct()
préserve l'ordre de la liste d'origine, en conservant la première occurrence de chaque élément. Il est implémenté en utilisant à la fois un ensemble et une liste.Si vous ne pouvez pas convertir votre liste d'origine en un type de collections Eclipse, vous pouvez utiliser ListAdapter pour obtenir la même API.
Remarque: je suis un committer pour les collections Eclipse.
la source
Ces trois lignes de code peuvent supprimer l'élément dupliqué d'ArrayList ou de toute collection.
la source
Lorsque vous remplissez ArrayList, utilisez une condition pour chaque élément. Par exemple:
Nous obtiendrons un tableau {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
la source
Si vous souhaitez conserver votre commande, il est préférable d'utiliser LinkedHashSet . Parce que si vous voulez passer cette liste à une requête d'insertion en l'itérant, l'ordre serait conservé.
Essaye ça
Cette conversion sera très utile lorsque vous souhaitez renvoyer une liste mais pas un ensemble.
la source
Code:
Remarque: Certainement, il y aura une surcharge de mémoire.
la source
la source
LinkedHashSet fera l'affaire.
// sortie: 5,1,2,3,4
la source
la source
Ceci est utilisé pour votre liste d'objets personnalisés
la source
vous pouvez utiliser la boucle imbriquée en suivant:
la source
Comme indiqué précédemment, vous devez utiliser une classe implémentant l'interface Set au lieu de List pour être sûr de l'unicité des éléments. Si vous devez conserver l'ordre des éléments, l'interface SortedSet peut alors être utilisée; la classe TreeSet implémente cette interface.
la source
Si vous utilisez le type de modèle List <T> / ArrayList <T>. J'espère que cela vous aidera.
Voici mon code sans utiliser aucune autre structure de données comme set ou hashmap
la source
la source
la source
la source
la source
Si vous souhaitez supprimer les doublons de ArrayList signifie trouver la logique ci-dessous,
la source