a
が配列の場合、a.index(a.max)
が必要ですが、Rubyに似たものが必要です。当たり前のことですが、そういうところや他の場所で答えを見つけるのに苦労しています。明らかに、私はRubyが初めてです。
Ruby 1.8.7以上の場合:
a.each_with_index.max[1]
それは1回の繰り返しを行います。完全にこれまでで最も意味のあるものではありませんが、これを頻繁に実行している場合は、とにかくindex_of_max
メソッドでラップします。
Ruby 1.9.2私はこれを行うことができます;
arr = [4, 23, 56, 7]
arr.rindex(arr.max) #=> 2
これが私がこの質問に答えようと思っていることです:
a = (1..12).to_a.shuffle
# => [8, 11, 9, 4, 10, 7, 3, 6, 5, 12, 1, 2]
a.each_index.max_by { |i| a[i] }
# => 9
ここにあるソリューションのいくつかの動作とパフォーマンスの違いに注意したいだけです。 duplicate max要素の「引き分け」動作:
_a = [3,1,2,3]
a.each_with_index.max[1]
# => 3
a.index(a.max)
# => 0
_
好奇心から、それらを_Benchmark.bm
_で実行しました(上記のa
の場合):
_user system total real
each_with_index.max 0.000000 0.000000 0.000000 ( 0.000011)
index.max 0.000000 0.000000 0.000000 ( 0.000003)
_
次に、Array.new(10_000_000) { Random.Rand }
を使用して新しいa
を生成し、テストを再実行しました。
_user system total real
each_with_index.max
2.790000 0.000000 2.790000 ( 2.792399)
index.max 0.470000 0.000000 0.470000 ( 0.467348)
_
これにより、特に高いインデックスmaxを選択する必要がない限り、a.index(a.max)
がより良い選択であると思います。
a = [1, 4 8]
a.inject(a[0]) {|max, item| item > max ? item : max }
少なくともRubyのようなものです:)
複数の場合、最大値のすべてのインデックス値を取得する方法は次のとおりです。
与えられた:
> a
=> [1, 2, 3, 4, 5, 6, 7, 9, 9, 2, 3]
すべての最大値(または指定された値)のインデックスは、次のようにして見つけることができます。
> a.each_with_index.select {|e, i| e==a.max}.map &:last
=> [7, 8]