Fév
19
2008

Comment supprimer les doublons d’une liste ou d’un tableau ?


Utilisez une table de hachage. Lorsque vous pensez à “unique” ou à “doublons”, pensez aux “clés de hachage”.

Si l’ordre des éléments ne compte pas, vous pouvez créer une table de hachage dont vous extrairez les clés. La manière de créer la table de hachage importe peu : il vous suffit d’utiliser keys pour récupérer les éléments uniques.

  my %hachage   = map { $_, 1 } @tableau;
  # ou via une tranche de hachage : @hachage{ @tableau } = ();
  # ou via un foreach : $hachage{$_} = 1 foreach ( @tableau );
  my @unique = keys %hachage;

Vous pouvez aussi parcourir tous les éléments et ne conservez que ceux que vous n’avez encore jamais vus. La première fois que la boucle traite un élément, cet élément n’a pas de clé correspondante dans %dejavu. Le condition dans l’instruction commençant par next crée cette clé et récupère immédiatement sa valeur (qui est undef) avant de l’incrémenter. Comme cette valeur initiale est fausse, le next n’a pas lieu et la boucle continue en exécutant le push. Lorsque la boucle rencontre à nouveau le même élément, la clé correspondante existe dans la tableau de hachage et cette clé est vraie (puisque sa valeur incrémentée n’est plus undef), et donc le next interrompt cette itération et la boucle passe à l’élément suivant.

  my @unique = ();
  my %dejavu = ();
  foreach my $elem ( @tableau )
    {
      next if $dejavu{ $elem }++;
      push @unique, $elem;
    }

Vous pouvez écrire cela de manière plus concise en utilisant grep, qui fera la même chose.

  my %dejavu = ();
  my @unique = grep { ! $dejavu{ $_ }++ } @tableau;

Au sujet de l'auteur: Olivier Legras

Auteur de ce Blog, je partage quelques unes de mes notes que je juge utile à vous comme à moi. Je suis très heureux de voir que mon blog a de plus en plus d'affluence. Merci à vous!

Laissez un commentaire