【问题标题】:Subtracting one Array from another in Ruby在Ruby中从另一个数组中减去一个数组
【发布时间】:2009-07-28 06:14:01
【问题描述】:

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

    @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 arrays array-difference


【解决方案1】:

您可以在 Ruby 中减去数组:

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

ary - other_ary → new_ary 数组差异

返回一个新数组,它是原始数组的副本,删除任何 也出现在 other_ary 中的项目。订单从 原始数组。

它使用哈希和 eql 比较元素?提高效率的方法。

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=&gt; [ 3, 3, 5 ]

如果你需要 类似集合的行为,请参阅库类 Set。

请参阅Array 文档。

【讨论】:

  • 精氨酸。对我来说大脸掌时刻。出于某种原因,我认为这不适用于对象。工作得很好 - 谢谢!
  • 注意这一点,先在 IRB 中测试一下,例如:[5, 5, 5, 5] - [5, 5] = [] ...数组。
  • 另请注意,这不起作用:[1,2]-[1,2,3] =&gt; []。但是[1,2,3]-[1,2] =&gt; [3]。啊。
  • 如果您从 减法 的角度来思考,那么最后一个“陷阱”实际上是有道理的。 subtract 你不要求 diff 的东西...你要求从 X 中减去 Y...如果 Y 甚至在 X 中都没有什么东西,那么结果是一种“未定义”,因此额外的 Y 元素不会包含在 X 结果中。
  • 具体来说,Array#- 是一组差异。它更像是Array#|(集合并集)的逆,而不是Array#+(连接)(根本不是集合操作!)。
【解决方案2】:

以上解决方案

a - b

从数组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
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]

即使两个数组未排序,代码也能正常工作。在示例中,数组已排序,但这不是必需的。

【讨论】:

  • delete_elements_in 在 Ruby 中不可用(ruby 2.6.3p62)
  • @qaisjp,因为它是由作者定义的。你也应该定义它。看上面的代码测试代码。
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
相关资源
最近更新 更多