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
à unique_array_of_item1
, mais seulement si unique_array_of_item1
ne contient pas item1
encore. Il existe une solution simple que je connais: il suffit de parcourir my_array
et de vérifier si unique_array_of_item1
contient déjà le courant item1
ou non.
Existe-t-il une solution plus efficace?
Set#each
etSet#to_a
) sont déléguées à@hash
. Et à partir de Ruby 1.9, des hachages sont commandés. "Les hachages énumèrent leurs valeurs dans l'ordre d'insertion des clés correspondantes." ruby-doc.org/core-1.9.1/Hash.html@Coorasse a une bonne réponse , même si elle devrait être:
Et pour mettre à jour
my_array
en place:la source
my_array |= [item]
qui sera mis à jourmy_array
en place|=
fonctionne très bien dans mes tests avec 2.1.1. Veuillez décrire votre scénario de test ou ouvrir une nouvelle question.Vous n'avez pas besoin de parcourir à la
my_array
main.Éditer:
Comme le souligne Tombart dans son commentaire, l'utilisation
Array#include?
n'est pas très efficace. Je dirais que l'impact sur les performances est négligeable pour les petits tableaux, mais vous voudrez peut-être opterSet
pour les plus grands.la source
array.include?(item)
a de la complexitéO(n)
- c'est donc comme une itération de l'ensemble du tableau. jetez un œil à ce benchmark: gist.github.com/deric/4953652Vous pouvez convertir item1 en tableau et les joindre:
la source
|
pas être||
(voir la réponse de Jason)Il est important de garder à l'esprit que la classe Set et le | La méthode (également appelée "Set Union") donnera un tableau d' éléments uniques , ce qui est génial si vous ne voulez pas de doublons, mais ce qui sera une mauvaise surprise si vous avez des éléments non uniques dans votre tableau d'origine par conception.
Si vous avez au moins un élément dupliqué dans votre tableau d'origine que vous ne voulez pas perdre, itérer dans le tableau avec un retour anticipé est le pire des cas O (n), ce qui n'est pas si mal dans le grand schéma des choses .
la source
Je ne sais pas si c'est la solution parfaite, mais a fonctionné pour moi:
la source