简体   繁体   English

如何找到数组最大值的索引?

[英]How do I find the index of the maximum value of an array?

I tried the solution recommended here -- In Ruby, what is the cleanest way of obtaining the index of the largest value in an array? 我尝试了这里推荐的解决方案- 在Ruby中,最干净的方法是获取数组中最大值的索引?

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

But am getting some exceptions: 但是有一些例外:

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>'

If you want to omit nil s from the result, then you can use: 如果要从结果中省略nil ,则可以使用:

array.index(array.compact.max)

Or if you wish to treat nil s like zeros, then first convert them to Float s: 或者,如果您希望将nil视为零,那么首先将它们转换为Float

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

In the event of a tie, this will return the index of the first max value. 如果出现平局,则将返回第一个最大值的索引。 You could also get the last index with Array#rindex . 您还可以使用Array#rindex获得最后一个索引。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM