2016-09-21 53 views
1

我想創建一個函數,返回包含在另一個數組列表中的數組列表。這是我想出了:如何在紅寶石中返回相交數組並保留小寫?

def coffee(arr) 
    acceptable_coffee = ["dark", "blend", "handsome"] 
    good_coffee = acceptable_coffee & arr.map{|n| n.downcase} 
end 

可能的輸入可能包含在acceptable_coffee。他們的情況下,元素可能無法始終downcase,即:

arr1 = ["dark", "decaf", "java", "HANDSOME"] 
arr2 = ["dark", "smooth", "BLEND"] 

我希望函數返回數組包含可接受的元素,同時保留它們的上/下。然後,該函數,應該返回:

coffee(arr1) #=> ["dark", "HANDSOME"] 
coffee(arr2) #=> ["dark", "BLEND"] 

目前,它分別返回["dark", "handsome"]["dark", "blend"]。如果我不做,它將不會正確交叉。我怎樣才能返回相交陣列,同時保持向上/向下?不要擔心其他邊緣情況。假設可能的陣列輸入元素或者完全大寫/完全小寫,就像這個例子。

回答

3

這將得到交集,但id並不完全使用時髦的&運算符或集合。

def coffee(rest) 
    acceptable_coffee = ["dark", "blend", "handsome"] 
    rest.select { |name| acceptable_coffee.include? name.downcase } 
end 
0

這不是最好的方法,但是你可以這樣做來保存大寫字母。

def coffee(arr) 
    acceptable_coffee = ["dark", "blend", "handsome"] 
    good_coffee = (acceptable_coffee & arr) + (arr & acceptable_coffee.map(&:upcase)) 
end 

coffee(arr1) #=> ["dark", "HANDSOME"] 
coffee(arr2) #=> ["dark", "BLEND"] 
+0

你的方法不適用於咖啡([「Dark」]),假設它應該返回'[「Dark」]'。 –

0
def coffee(arr, acceptable) 
    r = /#{acceptable.join('|')}/i 
    arr.select { |s| s =~ r } 
end 

acceptable = ["dark", "blend", "handsome"] 

coffee ["dark", "decaf", "java", "HANDSOME"], acceptable 
    #=> ["dark", "HANDSOME"] 
coffee ["dark", "smooth", "BLEND"], acceptable 
    #=> ["dark", "BLEND"] 

r = /#{acceptable.join('|')}/i 
    #=> /dark|blend|handsome/i 
0

我總是向正則表達式時,我想選擇與模式匹配的字符串。

def coffee(arr) 
    acceptable_coffee = /\A(?:dark|blend|handsome)\z/i 
    good_coffee = arr.grep(acceptable_coffee) 
end 

arr1 = ["dark", "decaf", "java", "HANDSOME"] 
arr2 = ["dark", "smooth", "BLEND"] 

coffee(arr1) #=> ["dark", "HANDSOME"] 
coffee(arr2) #=> ["dark", "BLEND"] 

解釋有關正則表達式/\A(?:dark|blend|handsome)\z/i

\A字符串開始處匹配(第一個字符之前)。
(?:)是一個非捕獲組,我可以把|
|顯示「或」。
\z匹配字符串的末尾(在最後一個字符後面)。
尾隨i外部/.../意味着忽略大小寫。