Ruby数组比较而不删除重复项

时间:2017-01-24 19:59:54

标签: ruby-on-rails arrays ruby include

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

下面是两个数组。无论多余的重复内容,我都需要验证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) }

2 个答案:

答案 0 :(得分:3)

  

验证ary2是否包含在ary1中

(ary2 - ary1).empty?
  

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

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

答案 1 :(得分:0)

在行之间阅读,我假设&{34; ary2 包含在<{1}}&#34;意味着,对于ary1的每个元素,ary2的唯一元素具有相同的值。通过&#34; unique&#34;我的意思是,例如,如果ary1包含两个ary2,则1必须包含两个或更多ary1个。1。如果对问题的解释不正确,则没有理由进一步阅读。

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

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