105 votes

Ajouter un élément à un tableau s'il ne s'y trouve pas déjà

J'ai une classe Ruby

class MyClass
  attr_writer :item1, :item2
end

my_array = get_array_of_my_class() #my_array is an array of MyClass
unique_array_of_item1 = []

Je veux pousser MyClass#item1 a unique_array_of_item1 mais seulement si unique_array_of_item1 ne contient pas ce item1 encore. Il y a une solution simple que je connais : il suffit d'itérer à travers my_array et vérifier si unique_array_of_item1 contient déjà l'actuel item1 ou pas.

Existe-t-il une solution plus efficace ?

147voto

Jason Denney Points 187

@Coorasse a un bonne réponse alors qu'elle devrait l'être :

my_array | [item]

Et pour mettre à jour my_array en place :

my_array |= [item]

84voto

Jiří Pospíšil Points 4847

Vous pouvez utiliser Définir au lieu de Array.

42voto

doesterr Points 2569

Vous n'avez pas besoin d'itérer à travers my_array à la main.

my_array.push(item1) unless my_array.include?(item1)

Edit :

Comme le souligne Tombart dans son commentaire, utiliser Array#include? n'est pas très efficace. Je dirais que l'impact sur les performances est négligeable pour les petites matrices, mais vous pourriez vouloir aller avec Set pour les plus grands.

34voto

coorasse Points 149

Vous pouvez convertir item1 en tableau et les joindre :

my_array | [item1]

4voto

elreimundo Points 5506

Il est important de garder à l'esprit que la classe Set et la méthode | (également appelée "Set Union") donneront un tableau de unique ce qui est très bien si vous ne voulez pas de doublons mais qui sera une surprise désagréable si vous avez des éléments non-uniques dans votre tableau d'origine à dessein.

Si vous avez au moins un élément en double dans votre tableau d'origine que vous ne voulez pas perdre, l'itération à travers le tableau avec un retour précoce est dans le pire des cas O(n), ce qui n'est pas si mal dans le grand schéma des choses.

class Array
  def add_if_unique element
    return self if include? element
    push element
  end
end

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