In Ruby, what is the cleanest way of obtaining the index of the largest value in an array?

Viewed 27835

If a is the array, I want a.index(a.max), but something more Ruby-like. It should be obvious, but I'm having trouble finding the answer at so and elsewhere. Obviously, I am new to Ruby.

7 Answers

For Ruby 1.8.7 or above:

a.each_with_index.max[1]

It does one iteration. Not entirely the most semantic thing ever, but if you find yourself doing this a lot, I would wrap it in an index_of_max method anyway.

a = [1, 4 8]
a.inject(a[0]) {|max, item| item > max ? item : max }

At least it's Ruby-like :)

Using #each_with_index and #each_with_object. Only one pass required.

def index_of_first_max(e)
  e.each_with_index.each_with_object({:max => nil, :idx => nil}) { |x, m| 
    x, i = x

    if m[:max].nil? then m[:max] = x
    elsif m[:max] < x then m[:max] = x; m[:idx] = i
    end
  }[:idx]
end

Or combining #each_with_index with #inject:

def index_of_first_max(e)
  e.each_with_index.inject([nil, 0]) { |m, x|
    x, i = x
    m, mi = m

    if m.nil? || m < x then [x, i]
    else [m, mi]
    end
  }.last    
end  
Related