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 funcional, 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 forma mejor. ¿Qué es? Gracias :-)
ruby
arrays
array-difference
doctor naranja
fuente
fuente
Respuestas:
Puede restar matrices en Ruby:
[1,2,3,4,5] - [1,3,4] #=> [2,5]
Consulte la documentación de Array .
fuente
[1,2]-[1,2,3] => []
. Pero[1,2,3]-[1,2] => [3]
. Argh.Array#-
es una diferencia establecida. Es más una inversa deArray#|
una unión de conjuntos que de unaArray#+
concatenación (¡no es una operación de conjuntos en absoluto!).La solución anterior
elimina todas las instancias de elementos en la matriz
b
de la matriza
.[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]
En algunos casos, desea que el resultado sea
[1, 2, 3, 3, 5]
. Es decir, no desea eliminar todos los duplicados, sino solo los elementos individualmente.Podrías 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 necesario.
fuente
delete_elements_in
no está disponible en Ruby propiamente dicho (ruby 2.6.3p62)