2009-07-28 22 views
68

Mam dwie tablice zadań - utworzone i przypisane. Chcę usunąć wszystkie przypisane zadania z tablicy utworzonych zadań. Oto mój działa, ale brudny, kod:Odejmowanie jednej tablicy od innej w Ruby

@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 

Jestem pewien, że istnieje lepszy sposób. Co to jest? Dzięki :-)

+0

Założę się, że pod maską odpowiedź brzmi tak, jak to zaprogramowałeś. – baash05

Odpowiedz

147

można odjąć tablic w Ruby:

[1,2,3,4,5] - [1,3,4] #=> [2,5] 

Ary - other_ary → new_ary Array Różnica

Zwraca nową tablicę, która jest kopią oryginalnej tablicy, usuwanie dowolne pozycje o wartości , które również pojawiają się w other_ary. Zamówienie jest przechowywane z oryginalnej tablicy .

Porównuje elementy używając ich hash i eql? metody efektywności.

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]

Jeśli potrzebujesz zachowanie zestaw podobny, zobacz Set Class Library.

Zobacz dokumentację Array.

+2

Arg. Dla mnie wielka chwila na twarzy. Z jakiegoś powodu myślałem, że to nie zadziała z przedmiotami. Pracowałem dobrze - dziękuję! – doctororange

+1

np, zdarza się :) – hobodave

+25

ostrożnie z tym, przetestuj go najpierw w IRB, na przykład: [5, 5, 5, 5] - [5, 5] = [] ... odejmowanie usuwa unikalne elementy w szyk. – hagope

4

Powyższe rozwiązanie

a - b 

usunięcie wszystkich przypadków elementy tablicy b z tablicy a.

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ] 

W niektórych przypadkach wymagany wynik to [1, 2, 3, 3, 5]. Oznacza to, że nie chcesz usuwać wszystkich duplikatów, ale tylko te elementy pojedynczo.

Można to osiągnąć przez

class Array 
    def delete_elements_in(ary) 
    ary.each do |x| 
     if index = index(x) 
     delete_at(index) 
     end 
    end 
end 

testu

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] 

Kod działa nawet wtedy, gdy obie tablice nie są sortowane. W tym przykładzie tablice są sortowane, ale nie jest to wymagane.

Powiązane problemy