369 votes

Suppression des éléments en double d'un tableau en Ruby

J'ai un tableau Ruby qui contient des éléments en double.

array = [1,2,2,1,4,4,5,6,7,8,5,6]

Comment puis-je supprimer tous les éléments en double de ce tableau tout en conservant tous les éléments uniques sans utiliser les boucles for et l'itération ?

799voto

Mithun Sasidharan Points 5589
array = array.uniq

uniq supprime tous les éléments en double et conserve tous les éléments uniques dans le tableau.

C'est l'une des nombreuses beautés du langage Ruby.

54 votes

Non, la méthode uniq ! retournera nil si le tableau était déjà unique Ex : a = [1,2,3,4] a.uniq -> [1,2,3,4] mais a.uniq ! -> nil

15 votes

Je ne verrais pas vraiment cela comme une beauté du langage ruby... c'est juste la beauté de la bibliothèque standard ruby... ne vous méprenez pas, il y a beaucoup de belles choses dans ce langage.

8 votes

Écrire la même chose en Objective-C, Javascript et PHP. Alors dites-nous que Ruby n'est pas un beau langage !

90voto

jaredsmith Points 459

Vous pouvez retourner l'intersection.

a = [1,1,2,3]
a & a

Cela permettra également de supprimer les doublons.

16 votes

Fonctionnellement, cette réponse est correcte, mais je pense que c'est nettement moins lisible que d'utiliser simplement uniq.

23 votes

Je l'ai juste mis ici pour que les personnes qui visitent cette page puissent voir d'autres façons de faire, je n'essayais pas de dire que c'est mieux de quelque façon que ce soit.

5 votes

La raison pour laquelle cela fonctionne est que lors de l'utilisation d'opérations de set, le tableau résultant est traité comme un set, qui est une structure de données qui n'a généralement pas de valeurs répétées. Utilisation de a | a (union) ferait la même chose.

57voto

maprihoda Points 5600

Vous pouvez supprimer les éléments en double avec la méthode uniq :

array.uniq  # => [1, 2, 4, 5, 6, 7, 8]

Ce qu'il serait également utile de savoir, c'est que uniq prend un bloc, donc si vous avez un tableau de clés :

["bucket1:file1", "bucket2:file1", "bucket3:file2", "bucket4:file2"]

et vous voulez savoir quels sont les fichiers uniques, vous pouvez le découvrir avec :

a.uniq { |f| f[/\d+$/] }.map { |p| p.split(':').last }

5 votes

Je suis un peu confus par cela. Le bloc est utilisé si vous avez besoin de votre propre fonction de comparaison -- dans votre exemple, l'envoi de uniq à ce tableau sans bloc renverrait la même valeur qu'avec votre bloc.

22voto

Lri Points 8342

Si quelqu'un cherchait un moyen de supprimer toutes les instances de valeurs répétées, voir " Comment extraire efficacement les éléments répétés dans un tableau Ruby ? ".

a = [1, 2, 2, 3]
counts = Hash.new(0)
a.each { |v| counts[v] += 1 }
p counts.select { |v, count| count == 1 }.keys # [1, 3]

4 votes

Ou vous pouvez simplement faire a = [1, 2, 2, 3] a.find_all { |x| a.count(x) == 1 } # [1, 3]

0 votes

La question liée n'est pas la même ; elle demande comment trouver les valeurs dupliquées et les retourner. Le PO veut supprimer les doublons.

20voto

Finks Points 1023

Juste une autre alternative si cela intéresse quelqu'un.

Vous pouvez également utiliser le to_set d'un tableau qui convertit le tableau en un ensemble et par définition, les éléments de l'ensemble sont uniques.

[1,2,3,4,5,5,5,6].to_set => [1,2,3,4,5,6]

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