2016-07-03 16 views
2

配列内の文字列の最初のn文字が同じかどうかを確認できる小さなメソッドを探しています。例えば配列内の部分文字列の一致

["Marseille", "Marsan", "Martin"].map { |x| x[0,4] } 
# => ["Mars", "Mars", "Mart"] 

Array#uniqは、重複項目を削除するには:

["Marseille", "Marsan", "Martin"].method(3) => true 
["Mar", "Mar", "Mar"] 
["Marseille", "Marsan", "Martin"].method(4) => false 
["Mars", "Mars", "Mart"] 

答えて

2

使用Array#mapは接頭辞配列を取得します。

["Marseille", "Marsan", "Martin"].map { |x| x[0,4] }.uniq 
# => ["Mars", "Mart"] 

すべての接頭辞が同じ場合、結果は単一項目の配列になります。


class Array 
    def same_prefix?(n) 
    self.map { |x| x[0, n] }.uniq.size == 1 
    end 
end 

["Marseille", "Marsan", "Martin"].same_prefix?(3) 
# => true 
["Marseille", "Marsan", "Martin"].same_prefix?(4) 
# => false 
+1

なぜ一つは '追加します。?same_prefixを' 'Array'に、このメソッドを追加した後? – Adobe

+0

@Adobe、それはirbセッションからコピーされました。私はそれを削除することを忘れました。それを指摘してくれてありがとう。 – falsetru

4

短いバージョンはブロックでArray#uniqを使用してEnumerable#one?次のようになります。

class Array 
    def same_prefix?(n) 
    uniq{|x| x[0, n]}.one? 
    end 
end 

Demonstration

+0

@CarySwoveland:それは純粋なルビーソリューションです。リンクを見てください。 – potashin

+2

私は[Enumerable#one?](http://ruby-doc.org/core-2.2.0/Enumerable.html#method-i-one-3F)を知らなかった。知っておいてよかった。 –

1
class Array 
    def same_start?(n) 
    start = first[0,n] 
    all? { |e| e[0,n] == start } 
    end 
end 

["Marseille", "Marsan", "Martian"].same_prefix?(3) #=> true 
["Marseille", "Marsan", "Martian"].same_prefix?(4) #=> false 
0

ここでこれを行うためのもう一つの方法です:

は、
arr = ["Marseille", "Marsan", "Martin"] 
n = 3 
arr.each_cons(2).all? {|s1, s2| s1[0...n] == s2[0...n]} 
#=> true 

わずかな変形はすることができ:

arr.map{|s| s[0...n]}.each_cons(2).all? {|s1, s2| s1 == s2} 
関連する問題