web-dev-qa-db-fra.com

Soustraire un tableau d'un autre dans Ruby

J'ai deux tableaux de tâches - créés et attribués. Je souhaite supprimer toutes les tâches attribuées du tableau des tâches créées. Voici mon code de travail, mais désordonné:

    @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

Je suis sûr qu'il y a une meilleure façon. Qu'Est-ce que c'est? Merci :-)

76
doctororange

Vous pouvez soustraire des tableaux dans Ruby:

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

ary - other_ary → new_ary Différence de tableau

Renvoie un nouveau tableau qui est une copie du tableau d'origine, supprimant tous les éléments qui apparaissent également dans other_ary. L'ordre est conservé à partir du tableau d'origine.

Il compare les éléments en utilisant leur hachage et leur eql? méthodes d'efficacité.

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

Si vous avez besoin d'un comportement de type ensemble, consultez la classe de bibliothèque Set.

Voir la documentation Array .

158
hobodave

La solution ci-dessus

a - b

supprime toutes les instances d'éléments du tableau b du tableau a.

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

Dans certains cas, vous souhaitez que le résultat soit [1, 2, 3, 3, 5]. Autrement dit, vous ne voulez pas supprimer tous les doublons, mais uniquement les éléments individuellement.

Vous pouvez y parvenir en

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

tester

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]

Le code fonctionne même lorsque les deux tableaux ne sont pas triés. Dans l'exemple, les tableaux sont triés, mais cela n'est pas obligatoire.

5
Zack Xu