114 votes

Java : Détecter les doublons dans ArrayList ?

Comment pourrais-je détecter (en retournant vrai/faux) si une ArrayList contient plus d'un élément identique en Java ?

Merci beaucoup, Terry

Modifier J'ai oublié de préciser 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() ;

214voto

Paul Tomblin Points 83687

Le plus simple : videz toute la collection dans un Set (en utilisant le constructeur Set(Collection) ou Set.addAll), puis regardez si le Set a la même taille que la ArrayList.

List<Integer> list = ...;
Set<Integer> set = new HashSet<Integer>(list);

if(set.size() < list.size()){
    /* There are duplicates */
}

Mise à jour : Si je comprends bien votre question, vous avez un tableau 2d de Block, comme dans

Tableau de blocs[][] ;

et vous voulez détecter si l'une de ces lignes contient des doublons ?

Dans ce cas, je pourrais faire ce qui suit, en supposant que Block implémente correctement "equals" et "hashCode" :

for (Block[] row : table) {
   Set set = new HashSet<Block>(); 
   for (Block cell : row) {
      set.add(cell);
   }
   if (set.size() < 6) { //has duplicate
   }
}

Je ne suis pas sûr à 100% de la syntaxe, il est donc peut-être plus sûr de l'écrire comme

for (int i = 0; i < 6; i++) {
   Set set = new HashSet<Block>(); 
   for (int j = 0; j < 6; j++)
    set.add(table[i][j]);
 ...

Set.add renvoie un booléen faux si l'élément ajouté est déjà dans l'ensemble, donc vous pourriez même court-circuiter et abandonner tout ajout qui renvoie false si tout ce que vous voulez savoir est s'il y a des doublons.

64voto

akuhn Points 12241

Code amélioré, utilisant la valeur de retour de Set#add au lieu de comparer la taille de la liste et de l'ensemble.

public static <T> boolean hasDuplicate(Iterable<T> all) {
    Set<T> set = new HashSet<T>();
    // Set#add returns false if the set does not change, which
    // indicates that a duplicate element has been added.
    for (T each: all) if (!set.add(each)) return true;
    return false;
}

15voto

matt b Points 73770

Si vous voulez éviter d'avoir des doublons, il vous suffit de supprimer le processus intermédiaire de détection des doublons et d'utiliser un programme de détection des doublons. Définir .

15voto

Sergiy Dakhniy Points 420

Avec Java 8+, vous pouvez utiliser l'API Stream :

boolean areAllDistinct(List<Block> blocksList) {
    return blocksList.stream().map(Block::getNum).distinct().count() == blockList.size();
}

13voto

user60062 Points 71

Code amélioré pour retourner les éléments en double

  • Peut trouver les doublons dans une collection
  • retourne l'ensemble des doublons
  • Des éléments uniques peuvent être obtenus à partir de l'ensemble

public static <T> List getDuplicate(Collection<T> list) {

    final List<T> duplicatedObjects = new ArrayList<T>();
    Set<T> set = new HashSet<T>() {
    @Override
    public boolean add(T e) {
        if (contains(e)) {
            duplicatedObjects.add(e);
        }
        return super.add(e);
    }
    };
   for (T t : list) {
        set.add(t);
    }
    return duplicatedObjects;
}

public static <T> boolean hasDuplicate(Collection<T> list) {
    if (getDuplicate(list).isEmpty())
        return false;
    return true;
}

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