Tengo una clase 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 = []
Quiero empujar MyClass#item1
a unique_array_of_item1
, pero sólo si unique_array_of_item1
no contiene que item1
todavía. Hay una solución simple que conozco: simplemente iterar my_array
y verificar si unique_array_of_item1
ya contiene la corriente item1
o no.
¿Existe alguna solución más eficiente?
Set#each
ySet#to_a
) delegar@hash
. Y a partir de Ruby 1.9 se ordenan los Hashes. "Los hash enumeran sus valores en el orden en que se insertaron las claves correspondientes". ruby-doc.org/core-1.9.1/Hash.html@Coorasse tiene una buena respuesta , aunque debería ser:
Y para actualizar
my_array
en su lugar:fuente
my_array |= [item]
que se actualizarámy_array
en su lugar|=
funciona bien en mis pruebas con 2.1.1. Describe tu caso de prueba o abre una nueva pregunta.No es necesario que lo recorras a
my_array
mano.Editar:
Como señala Tombart en su comentario, usar
Array#include?
no es muy eficiente. Yo diría que el impacto en el rendimiento es insignificante para las matrices pequeñas, pero es posible que desee optarSet
por las más grandes.fuente
array.include?(item)
tiene complejidadO(n)
, por lo que es como iterar toda la matriz. Eche un vistazo a este punto de referencia: gist.github.com/deric/4953652Puede convertir item1 en matriz y unirlos:
fuente
|
no||
(véase la respuesta de Jason)Es importante tener en cuenta que la clase Set y la | El método (también llamado "Establecer unión") producirá una matriz de elementos únicos , lo cual es excelente si no desea duplicados, pero será una sorpresa desagradable si tiene elementos no únicos en su matriz original por diseño.
Si tiene al menos un elemento duplicado en su matriz original que no quiere perder, iterar a través de la matriz con un retorno temprano es el peor de los casos O (n), que no es tan malo en el gran esquema de las cosas .
fuente
No estoy seguro de si es la solución perfecta, pero funcionó para mí:
fuente