2017-01-24 118 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