J'ai une liste de type Integer par exemple:
[1, 1, 2, 3, 3, 3]
Je voudrais une méthode pour renvoyer tous les doublons, par exemple:
[1, 3]
Quelle est la meilleure façon de procéder?
java
collections
le plus frais
la source
la source
Réponses:
La méthode
add
deSet
retourne un booléen si une valeur existe déjà (true si elle n'existe pas, false si elle existe déjà, voir la documentation Set ).Il suffit donc de parcourir toutes les valeurs:
la source
for (Integer yourInt
, pour éviter la boxe et le déballage inutiles, d'autant plus que votre entrée contient déjà desInteger
s.HashSet
vous devez également considérer le facteur de charge, par exemple lorsque vous spécifiez une capacité initiale de100
, parce que vous voulez ajouter ce nombre d'éléments, il est arrondi à la puissance suivante de 2 (128
), ce qui implique que avec le facteur de charge par défaut de0.75f
, le seuil de redimensionnement sera96
, il y aura donc un redimensionnement avant que vous ayez ajouté des100
éléments. Heureusement, le redimensionnement n'est plus si cher. Avec les JRE à jour, le redimensionnement ne se répète plus, les éléments sont simplement répartis entre leurs deux emplacements de résultat possibles en fonction du bit pertinent.J'avais également besoin d'une solution à cela. J'ai utilisé la solution de leifg et l'ai rendue générique.
la source
J'ai pris la solution de John Strickler et l'ai refaite pour utiliser l'API streams introduite dans JDK8:
la source
distinct()
méthode intégrée est également avec état. Impossible de penser à une opération distincte efficace (O (n)) qui n'est pas avec état.Voici une solution utilisant Streams avec Java 8
Vous regardez simplement si la fréquence de cet objet est plus d'une fois dans votre liste. Appelez ensuite .distinct () pour n'avoir que des éléments uniques dans votre résultat
la source
Collections::frequency
est sur). Il doit parcourir toute la collection pour trouver la fréquence d'un article. Et nous appelons cela une fois pour chaque élément de la collection, ce qui crée ces extraitsO(n^2)
. Vous remarquerez la différence dans toute collection de plus d'une poignée d'éléments. Je n'utiliserais jamais cela dans le code réel.solution de base java 8:
la source
Évidemment, vous pouvez faire ce que vous voulez avec eux (c'est-à-dire mettre dans un ensemble pour obtenir une liste unique de valeurs en double) au lieu d'imprimer ... Cela a également l'avantage d'enregistrer l'emplacement des éléments en double.
la source
Utilisation de Guava sur Java 8
la source
Cela fonctionne également:
la source
Vous pouvez utiliser quelque chose comme ceci:
la source
int
comme type de variable ici. Cela signifie que pour chaque itération, un entier est déballé une fois et un int est encadré quatre fois!Lambas pourrait être une solution
la source
Utilisez une MultiMap pour stocker chaque valeur sous la forme d'un ensemble clé / valeur. Ensuite, parcourez les clés et trouvez celles avec plusieurs valeurs.
la source
Si vous utilisez les collections Eclipse , cela fonctionnera:
Mise à jour: à partir d'Eclipse Collections 9.2, vous pouvez désormais utiliser
selectDuplicates
Vous pouvez également utiliser des collections primitives pour ce faire:
Remarque: je suis un committer pour les collections Eclipse.
la source
la source
Similaire à certaines réponses ici, mais si vous voulez trouver des doublons en fonction d'une propriété:
la source
créer un
Map<Integer,Integer>
, itérer la liste, si un élément est dans la carte, augmenter sa valeur, sinon l'ajouter à la carte avec clé = 1itérer la carte, et ajouter aux listes tous les éléments avec clé> = 2
la source
Version compacte et généralisée de la réponse principale, également ajout d'un chèque vide et d'une taille de jeu préallouée:
la source
tempSet
avec quelistSize
lorsque cela est nécessaire. C'est une optimisation mineure mais je l'aime bien.J'ai pris la réponse de Sebastian et y ai ajouté un extracteur de clé -
la source
Une alternative thread-safe est la suivante:
la source
Essayez ceci pour trouver les éléments en double dans la liste:
la source
Cela devrait fonctionner pour les fichiers triés et non triés.
la source
C'est un problème où les techniques fonctionnelles brillent. Par exemple, la solution F # suivante est à la fois plus claire et moins sujette aux bogues que la meilleure solution Java impérative (et je travaille quotidiennement avec Java et F #).
Bien sûr, cette question concerne Java. Ma suggestion est donc d'adopter une bibliothèque qui apporte des fonctionnalités fonctionnelles à Java. Par exemple, il pourrait être résolu en utilisant ma propre bibliothèque comme suit (et il y en a plusieurs autres qui valent la peine d'être examinés):
la source
la source
la source
Ce serait une bonne méthode pour trouver des valeurs en double, sans utiliser Set.
Et disons que vous voulez une méthode qui vous renvoie une liste distincte, c'est-à-dire que si vous passez une liste où des éléments se produisent plus d'une fois, vous obtiendrez une liste avec des éléments distincts.
la source
Et la version qui utilise la
commons-collections
CollectionUtils.getCardinalityMap
méthode:''
la source
Et ce code -
la source
juste au cas où pour ceux qui veulent également inclure à la fois les doublons et les non doublons. fondamentalement, la réponse est similaire à la bonne réponse mais au lieu de revenir de sinon partie, vous retournez l'autre partie
utilisez ce code (changez pour le type dont vous avez besoin)
la source
Méthode plus générique comme variante de https://stackoverflow.com/a/52296246
la source
Si vous connaissez la valeur maximale (par exemple <10000), vous pouvez sacrifier de l'espace pour la vitesse. Je ne me souviens plus du nom exact de cette technique.
pseudo code:
la source
Essayez simplement ceci:
Exemple si les valeurs de liste sont: [1, 2, 3, 4, 5, 6, 4, 3, 7, 8] élément en double [3, 4].
la source