23

これをよりエレガントに書き直す方法はありますか? これは悪いコードであり、リファクタリングする必要があると思います。

>> a = [2, 4, 10, 1, 13]
=> [2, 4, 10, 1, 13]
>> index_of_minimal_value_in_array = a.index(a.min)
=> 3
4

4 に答える 4

47

これは配列を1回だけトラバースし、それでも読みやすいと思います:

numbers = [20, 30, 40, 50, 10]           # => [20, 30, 40, 50, 10]
elem, idx = numbers.each_with_index.min  # => [10, 4]
于 2012-11-04T15:40:17.407 に答える
9

これは配列を1回だけary.index(ary.min)トラバースしますが、2回トラバースします。

ary.each_with_index.inject(0){ |minidx, (v,i)| v < a[minidx] ? i : minidx }
于 2011-11-22T15:04:34.027 に答える
8

他の状況 (すべての最後の最小要素のみを見つける) について読むことは興味深いでしょう。

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
于 2011-02-11T04:31:37.007 に答える
4

私は実際に@andersonvomの答えが好きです。配列を1回ループするだけで、インデックスを取得できます。

を使用したくない場合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
于 2015-04-22T07:09:07.463 に答える