【问题标题】:Ruby Array Comparison Without Deleting Duplicates不删除重复项的 Ruby 数组比较
【发布时间】:2017-06-09 19:47:32
【问题描述】:

我已经看到很多关于此的问题,但没有一个解决重复值问题的问题。

下面是两个数组。我需要验证 ary2 是否包含在 ary1 中,无论是否有额外的重复项。无论数组是保存数字还是字符,也需要工作。

ary1 = [1, 1, 1, 2, 2, 3, 4, 5, 6]
ary2 = [1, 1, 2, 3, 5]

应该等于[1, 1, 2, 3, 5],我的代码等于[1, 1, 1, 2, 2, 3, 5]

尝试了很多选项,包括keep_ifkeep_atdelete_ifdelete_atslicemap等。

当前代码:

ary1.keep_if { |x| ary2.include?(x) }

【问题讨论】:

  • 您说您希望验证ary2 是否包含在ary1 中。这需要truefalse 的答案,但你说答案应该是[1,1,2,3,5]。这是没有意义的。假设ary1 = [1]ary2 = [1,1]。在他的情况下,ary2“包含”在ary1 中?请编辑您的问题以澄清您的要求。

标签: ruby-on-rails arrays ruby include


【解决方案1】:

在字里行间,我假设“ary2 is included in ary1”意味着对于ary2 的每个元素,ary1 都有一个唯一元素具有相同的价值。 “唯一”是指,例如,如果ary2 包含两个1ary1 必须包含两个或更多1。如果对问题的这种解释不正确,则没有理由进一步阅读。

如果我的假设是正确的,我们可以构造一个返回truefalse 的方法(带有参数ary1ary2),但如果有匹配项(true)可能会更多在ary1 的元素与ayr2 的元素匹配后返回“剩余”的ary1 元素很有用。

def ary2_included_in_ary1?(ary1, ary2)
  ary1_cpy = ary1.dup
  ary2.all? do |n|
    idx = ary1_cpy.index n
    return false if idx.nil?
    ary1_cpy.delete_at(idx)
  end
  ary1_cpy
end

ary1 = [1, 1, 1, 2, 2, 3, 4, 5, 6]

ary2 = [1, 1, 2, 3, 5]
ary2_included_in_ary1?(ary1, ary2)
  #=> [1, 2, 4, 6]

ary2 = [1, 1, 2, 3, 7]
ary2_included_in_ary1?(ary1, ary2)
#=> false

【讨论】:

    【解决方案2】:

    验证ary2是否包含在ary1中

    (ary2 - ary1).empty?
    

    应该等于[1, 1, 2, 3, 5]

    ary2.select { |e| ary1.include?(e) }
    

    【讨论】:

    • 效果很好。如果我想在使用 select 后查找 ary1 中剩下的内容怎么办。我试过拒绝,但它也会删除重复项。
    • ary1.select { |e| !ary2.include?(e) }
    猜你喜欢
    • 2011-12-18
    • 2014-12-16
    • 2017-12-31
    • 2011-11-05
    • 2013-02-02
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多