2017-02-03 4 views
0

私はRuby 2.4を使用しています。私はeleemntが配列に回以上発生したことがない場合要素が配列内で2回以上出現するかどうかを調べるには、文字列パターンの影響を受けますか?

data_arr.count(string) <= 2 

しかしを使用して、確認する方法を知っている私の配列が

["1/5", "2/6", "3/5", "4/7", "3/8", "3/9"] 

であればどのように私はチェックしますその前に最初の数」/""/"の前に2回以上出現することはありませんか?つまり、上記の例では、 "1"は2回以上(要素 "1/5"のみ)発生することはありませんが、 "3"は "/"の前に3回発生します。

答えて

0

hash::newをデフォルト値の0から使用して、という計算ハッシュを作成することがあります。

arr = ["1/5", "2/6", "3/5", "4/7", "3/8", "3/9"] 

h = arr.each_with_object(Hash.new(0)) { |s,h| h[s[/\d+(?=\/)/]] += 1 } 
    #> {"1"=>1, "2"=>1, "3"=>3, "4"=>1} 

その後

h.any? { |_,v| v > 2 } 
    #=> true 
0

私が提案する最初のステップは、配列の各文字列に対して文字列分割を行うことです。そうすれば、整数間の再発をチェックできます。

たとえば、配列内の各要素について、 array[element].split("")を実行してください。

1
2.2.1 :005 > array = ["1/5", "2/6", "3/5", "4/7", "3/8", "3/9"] 
=> ["1/5", "2/6", "3/5", "4/7", "3/8", "3/9"] 
2.2.1 :006 > array.count{|m| m.match(/3\//) } 
=> 3 

これは方法に「ブロックを渡す」ことによって動作します。ブロックは各品目について評価され、mであり、真の場合、項目は「カウント」されます。

この場合、正規表現を使用してスラッシュの前に '3'の項目を選択しています。あなたはいかなる分子は*以上の2倍で発生しているかどうかを確認したい場合は

regex: /#{variable}/ 
string: "#{string}" 
+0

を書いたり、ちょうど 'm.start_withを使うのか?( "3 /")' – akuhn

+0

は、なぜあなたは '3 /'ハードコードでしょう?あなたが質問に与えられた例に合わせるだけであれば、 'true'を直接返すこともできます。 –

+0

私は、 'count'に渡されたブロックから 'true'または 'false'を得るためにステートメントに対して "m"を評価する方法の例を提供していました。これは、読者が変数を正規表現に(またはakuhnの場合は文字列に)補間する方法を知っていることを前提としています。私はこの答えを修正して、これについての指示を含めるだろうが、それは質問されている質問に直接関係していないので、私はそれを含むとは思わなかった。 –

0

再:コメントは、あなたは次のように何でも/正規表現/文字列にたい任意の数を補間することができますあなたはこのコードを使用して配列:

data_arr.each do |element| 
    numerator = element.match(/(.+)\//) 
    if data_arr.count {|e| e.match(/^#{numerator}\//)} > 2 
    # do something if the element matches more than twice 
    end 
end 

* numeratorは、部門の/前の数です。

関連する問題