Ich habe zwei Arrays von Aufgaben - erstellt und zugewiesen. Ich möchte alle zugewiesenen Aufgaben aus dem Array der erstellten Aufgaben entfernen. Hier ist mein funktionierender, aber unordentlicher Code:
@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
Ich bin sicher, es gibt einen besseren Weg. Was ist es? Vielen Dank :-)
ruby
arrays
array-difference
Doktororange
quelle
quelle
Antworten:
Sie können Arrays in Ruby subtrahieren:
[1,2,3,4,5] - [1,3,4] #=> [2,5]
Siehe die Array- Dokumentation.
quelle
[1,2]-[1,2,3] => []
. Aber[1,2,3]-[1,2] => [3]
. Argh.Array#-
ist ein Satz Unterschied. Es ist eher eine Umkehrung einer Mengenvereinigung alsArray#|
eineArray#+
Verkettung (überhaupt keine Mengenoperation!).Die obige Lösung
löscht alle Instanzen von Elementen im Array
b
aus dem Arraya
.[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]
In einigen Fällen möchten Sie das Ergebnis haben
[1, 2, 3, 3, 5]
. Das heißt, Sie möchten nicht alle Duplikate löschen, sondern nur die Elemente einzeln.Sie könnten dies erreichen, indem Sie
class Array def delete_elements_in(ary) ary.each do |x| if index = index(x) delete_at(index) end end end end
Prüfung
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]
Der Code funktioniert auch dann, wenn die beiden Arrays nicht sortiert sind. Im Beispiel sind die Arrays sortiert, dies ist jedoch nicht erforderlich.
quelle
delete_elements_in
ist in Ruby nicht verfügbar (Ruby 2.6.3p62)