これをよりエレガントに書き直す方法はありますか?これは悪いコードであり、リファクタリングする必要があると思います。
>> a = [2, 4, 10, 1, 13]
=> [2, 4, 10, 1, 13]
>> index_of_minimal_value_in_array = a.index(a.min)
=> 3
他の状況について読むことは興味深いでしょう(最後の最小限の要素をすべて見つける)。
ary = [1, 2, 1]
# find all matching elements' indexes
ary.each.with_index.find_all{ |a,i| a == ary.min }.map{ |a,b| b } # => [0, 2]
ary.each.with_index.map{ |a, i| (a == ary.min) ? i : nil }.compact # => [0, 2]
# find last matching element's index
ary.rindex(ary.min) # => 2
これは配列を1回だけトラバースし、それでも読みやすいと思います。
ary = [2,3,4,5,1] # => [2,3,4,5,1]
ary.each_with_index.min # => [1, 4]
# where 1 is the element and 4 is the index
これは配列を1回だけトラバースしますが、ary.index(ary.min)
は配列を2回トラバースします。
ary.each_with_index.inject(0){ |minidx, (v,i)| v < a[minidx] ? i : minidx }
私は実際に@andersonvomの答えが好きです。配列を一度ループするだけで、インデックスを取得できます。
また、ary.each_with_index.min
を使用したくない場合は、次のことができます。
ary = [2,3,4,5,1] # => [2,3,4,5,1]
_, index_of_minimal_value_in_array = ary.each_with_index.min # => [1, 4]
index_of_minimal_value_in_array # => 4