2017-01-17 1 views
2

私はRuby 2.4を使用しています。私はこの回を除いて、素晴らしい作品整数を考慮して、文字列の配列内の最小要素を見つけるにはどうすればよいですか?

data.map(&:to_i).min 

私は、アレイ内の最小数を把握するために、以下のいる

["1", "55", "25", ... ] 

...整数ことになっている文字列の配列を持っています非整数文字列は私のdata.map(&:to_i).min線と

["1", "a", "2", "3"] 

ように、私の配列に這う場合、上記戻り、ゼロ。実際に整数である配列の要素の最小値しか取らないように、コードを変更するにはどうすればよいですか?

答えて

4

あなたがこれを行うためのいくつかの方法がありますが、最も簡単なあなたはゴミを無視したい場合は非数値を選別することです:

data = ["1", "a", "2", "3"] 
data.grep(/\A\-?\d+\z/).map(&:to_i).min 
# => 1 

grep方法は、物事をピックアップすることがかなり容易になります特定のパターンだけでなく、他の多くのものにも一致します。

+0

@steenslagこのデータが肯定的であるかどうかは明らかではありませんでしたが、いずれにしてもオプションの '-'が追加されました。 – tadman

3

私はいつもKernel::Integerを使用し、それが整数の文字列表現である場合にのみや、文字列を整数に変換したい:ここ

arr = ["3", "a", "2", "0x01", "0c", "0b11", "0o03", "4", "1_000"] 

arr.select { |s| Integer(s) rescue nil }.min_by { |s| Integer(s) } 
    #=> "0x01" 

arr.select { |s| Integer(s) rescue nil } 
    #=> ["3", "2", "0x01", "0b11", "0o03", "4", "1_000"] 

注意"0x01".to_i #=> 0(そうではないので、Integerを2回使用する必要があります)。

ストリングが整数の表現ではない場合、Integerは、例外を発生させる:

インライン救出さ
Integer("a") 
    #=> ArgumentError: invalid value for Integer(): "a" 

nilが選択されていない文字列であり、結果として返されるせます。 (もちろん、余分な距離を移動して、ArguementError例外を救う句を使用することもできます)

質問は、配列の要素(文字列)が返されるかどうか尋ねます。その整数同等を希望する場合は、次のように記述することができます:

我々は次の操作を行うと、冗長な-文字列除外することができます Enumerable#grep_v使用
a = arr.map { |s| Integer(s) rescue nil }.compact.min 
    #=> 1 

arr.map { |s| Integer(s) rescue nil } 
    #=> [3, nil, 2, 1, nil, 3, 3, 4, 1_000] 

['a', 'b'].map { |s| Integer(s) rescue nil }.compact.min 
    #=> nil 
0

arr = ["1", "a", "2", "3"] 
arr.grep_v(/[a-zA-Z]+/).min_by(&:to_i) #=> "1" 

あなたが適切だと思うように正規表現を修正してください。

関連する問題