2017-01-24 78 views
0

我已经看到很多关于此的问题,但没有解决重复值问题的问题。以下是两个数组。我需要验证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) } 
+1

你说你想验证'ary2'是否包含在'ary1'中。这需要一个“真”或“假”的答案,但你然后说答案应该是'[1,1,2,3,5]'。这是没有意义的。假设'ary1 = [1]'和'ary2 = [1,1]'。在他的情况下'ary2'“包含”在'ary1'中?请编辑你的问题,以澄清你的问题。 –

回答

3

验证ary2被包括在ary1

(ary2 - ary1).empty? 

应等于行间[1, 1, 2, 3, 5]

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

工程很棒。如果我想在选择使用后找到ary1中留下的内容,该怎么办?我尝试了拒绝,但它也删除了重复项。 –

+0

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

0

阅读,我假设“ary2在包含ary1“意思是,对于ary2的每个元素,th它们是具有相同价值的ary1的独特元素。举例来说,“唯一”我的意思是,如果ary2包含两个1's,则ary1必须包含两个或多个1's。如果这个问题的解释不正确,那么没有理由再读。

如果我的假设是正确的,我们可以构建返回truefalse的方法(带参数ary1ary2),但如果有一个匹配(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