2017-11-12 7 views
0

私はここに推奨される解決策を試してみました - In Ruby, what is the cleanest way of obtaining the index of the largest value in an array?配列の最大値のインデックスを見つけるにはどうすればよいですか?

array = [nil, nil, nil, nil, nil, 0.9655172413793104, nil, nil] 
idx = array.each_with_index.max[1] 

しかし、いくつかの例外を取得しています:

ArgumentError: comparison of Array with Array failed 
    from (irb):4:in `each' 
    from (irb):4:in `each_with_index' 
    from (irb):4:in `each' 
    from (irb):4:in `max' 
    from (irb):4 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.3/lib/rails/commands/console.rb:65:in `start' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.3/lib/rails/commands/console_helper.rb:9:in `start' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.3/lib/rails/commands/commands_tasks.rb:78:in `console' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.3/lib/rails/commands/commands_tasks.rb:49:in `run_command!' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.3/lib/rails/commands.rb:18:in `<top (required)>' 
    from bin/rails:4:in `require' 
    from bin/rails:4:in `<main>' 
+1

'nil'が浮動小数点以下であるかどうかをどのように判断しますか? 'nil'がゼロに等しいと思うと仮定すると、' .map(&:to_f) 'をチェーンに詰め込むことができます。 –

+1

最大値が複数ある場合はどうなりますか? –

答えて

2

あなたは結果からnil Sを省略する場合は、あなたが使用することができます。

array.index(array.compact.max) 

nilさんのように0を処理したい場合は、最初にに変換してください秒:同点の場合には

array.index(array.map(&:to_f).max) 

、これは最初最大値のインデックスを返します。 最後にのインデックスをArray#rindexとすることもできます。

0
def max_idx(array) 
    mx = array.select { |e| e.kind_of?(Numeric) }.max 
    mx ? array.each_index.select { |i| array[i] == mx } : nil 
end  

require 'bigdecimal' 
max_idx [nil,3,1]     #=> [1] 
max_idx [nil,3.2,"cat",1]   #=> [1] 
max_idx [nil,3,nil,1,3]    #=> [1,4] 
max_idx [nil,3.2,nil,1,3.2]   #=> [1,4] 
max_idx [nil,Rational(3),1]   #=> [1] 
max_idx [nil,BigDecimal.new("3"),1] #=> [1] 
max_idx [nil,nil,nil]    #=> nil 
関連する問題