78 votes

Soustraire un tableau d'un autre en Ruby

J'ai deux tableaux de tâches - créées et assignées. Je veux supprimer toutes les tâches assigné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 existe une meilleure solution. Quelle est-elle ? Je vous remercie :-)

164voto

hobodave Points 14566

Il est possible de soustraire des tableaux en 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 o éléments qui apparaissent également dans other_ary. L'ordre est préservé par rapport au tableau tableau original.

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

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

I d'un comportement similaire à celui d'un set, consultez la classe de bibliothèque Set.

Voir le Tableau la documentation.

12voto

Zack Xu Points 1531

La solution ci-dessus

a - b

supprime toutes les instances des é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] . En d'autres termes, vous ne voulez pas supprimer tous les doublons, mais seulement les éléments individuellement.

Pour ce faire, vous pouvez

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

test

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 si les deux tableaux ne sont pas triés. Dans l'exemple, les tableaux sont triés, mais ce n'est pas nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X