2016-09-21 5 views
1

配列の別のリストに含まれる配列のリストを返す関数を作成したいと思います。これは私が思い付いたものです:ruby​​で交差配列を返す方法とup/lowercaseを保持する方法はありますか?

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

可能な入力はacceptable_coffee .Theirケース内の要素を含むことができ、常にすなわち、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 "]'を返すと仮定した場合、あなたは 'coffee([" 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は、(最初​​の文字の前に)文字列の先頭にマッチします。
(?:)はキャプチャしないグループです。ここには|を入れることができます。
|は "or"と読みます。
\zは、文字列の最後(最後の文字の後)と一致します。
末尾のiの外側にあるのは、/.../です。

関連する問題