2013-05-16 74 views
0

下面是測試案例如何輸出不區分大小寫的數組元素

a = ["Barack", "Obama"] 
b = ["John", "Obama"] 

現在,如果我這樣做a & b。它給了我["Obama"]。常見的一個被渲染。

雖然如果是這樣的情況

a = ["Barack", "Obama"] 
b = ["John", "obama"] # See O is not capitalized here 

我做a & b。我將得到一個空數組[]作爲輸出。我明白爲什麼。雖然,如何解決這個問題,並使其區分大小寫而不區分大小寫?

感謝

更新:它不是必要,將永遠在downcase。 a可能有小寫字符串,b有全部大寫字符串,反之亦然。

回答

2

這不是防彈的,它不產生原始數組的值,但它可能不夠好™:

common = a.map(&:downcase) & b.map(&:downcase) 

檢索滿足測試你可以嘗試一些原始值像這樣:

require 'set' 

xs = ["Barack", "Obama"] 
ys = ["John", "Obama"] 

univ = ys.map(&:downcase).to_set 
hits = xs.select { |x| univ.include?(x.downcase) } 
+0

請注意,這將只適用於如果您的數組包含**只有**字符串。 (或者是一個響應'downcase'的自定義對象) –

+0

@CharlesCaldwell對,我明白了。 – psharma

+0

@FMc你知道我可以產生原始數組值嗎? – psharma

2

這適用於更一般的情況:

class Array 
    def intersection other, &block 
    block ||= proc{|x| x } 
    res = [] 
    transformed_other = other.map(&block) 
    self.each do |x| 
     res << x if transformed_other.include?(block.call(x)) 
    end 
    res 
    end 
end 

現在用您的測試數據:

a = ["Barack", "Obama"] 
b = ["John", "obama"] 

您可以正常相交陣列(相當於a & b):

a.intersection(b) 
#=> [] 

或者你可以提供一個塊:

a.intersection(b, &:downcase) 
#=> ["Obama"] 

這種方法將保留來自第一個數組的原始值,在這種情況下爲a

+0

但我會,如果沒有一個downce這將是一個問題。或者,也許我必須發出兩次命令。讓我們看看我是否可以調整它。謝謝雖然:) – psharma

+0

它將一切都轉換爲downcased字符串進行比較,但它實際上返回從左手陣列的原始值。所以它也將工作,如果一切都大寫,去試試看吧;-) –

+0

啊,我現在看到。哇,這很好。謝謝 :) – psharma

0

下面是在兩個列表的連接上使用group_by的一般方法的另一種方法。結果包含接收器中元素的原始表示。

class Array 
    def intersect_by other, &block 
    (self + other). 
    group_by(&block). 
    values. 
    select{ |v| v.size == 2 }. 
    map(&:first) 
    end 
end 

a.intersect_by(b, &:downcase) 
=> ["Obama"] 
相關問題