怎么在Ruby中从另一个数组中减去一个数组?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我有两个任务数组 - created和assigned。我想从创建的任务数组中删除所有分配的任务。这是我的工作,但是很乱,代码:

    @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

我确定有更好的方法。它是什么?

提问于
用户回答回答于

可以在Ruby中减去数组:

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

用户回答回答于

上述解

a - b

删除数组中元素的所有实例

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

在某些情况下,希望结果是[1, 2, 3, 3, 5]。也就是说,你不想删除所有重复的元素,而只想单独删除元素。

你可以通过

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

实验一下

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]

即使这两个数组没有排序,代码也能工作。在这个例子中,数组是排序的,但这不是必需的。

扫码关注云+社区