bidimensionales - arreglos en ruby
Restando una matriz de otra en Ruby (2)
La solución anterior
a - b
elimina todas las instancias de elementos en la matriz b
de la matriz a
.
[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]
En algunos casos, quiere que el resultado sea [1, 2, 3, 3, 5]
. Es decir, no desea eliminar todos los duplicados, sino solo los elementos individualmente.
Usted podría lograr esto por
class Array
def delete_elements_in(ary)
ary.each do |x|
if index = index(x)
delete_at(index)
end
end
end
end
prueba
irb(main):198:0> a = [ 1, 1, 2, 2, 3, 3, 4, 5 ]
=> [1, 1, 2, 2, 3, 3, 4, 5]
irb(main):199:0> b = [ 1, 2, 4 ]
=> [1, 2, 4]
irb(main):200:0> a.delete_elements_in(b)
=> [1, 2, 4]
irb(main):201:0> a
=> [1, 2, 3, 3, 5]
El código funciona incluso cuando las dos matrices no están ordenadas. En el ejemplo, las matrices están ordenadas, pero esto no es obligatorio.
Tengo dos matrices de Tareas: creadas y asignadas. Quiero eliminar todas las tareas asignadas de la matriz de tareas creadas. Aquí está mi código de trabajo, pero desordenado:
@assigned_tasks = @user.assigned_tasks
@created_tasks = @user.created_tasks
#Do not show created tasks assigned to self
@created_not_doing_tasks = Array.new
@created_tasks.each do |task|
unless @assigned_tasks.include?(task)
@created_not_doing_tasks << task
end
end
Estoy seguro de que hay una mejor manera. ¿Qué es? Gracias :-)
Puedes restar matrices en Ruby:
[1,2,3,4,5] - [1,3,4] #=> [2,5]
ary - other_ary → new_ary Diferencia de matriz
Devuelve una nueva matriz que es una copia de la matriz original, eliminando los elementos que también aparecen en other_ary. El orden se preserva de la matriz original.
¿Compara elementos usando su hash y eql? métodos para la eficiencia.
[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]
Si necesita un comportamiento parecido a un set, consulte la clase de biblioteca Set.
Ver la documentación de Array .