web-dev-qa-db-ja.com

Rubyで、配列内の最大値のインデックスを取得する最もクリーンな方法は何ですか?

aが配列の場合、a.index(a.max)が必要ですが、Rubyに似たものが必要です。当たり前のことですが、そういうところや他の場所で答えを見つけるのに苦労しています。明らかに、私はRubyが初めてです。

52
Cary Swoveland

Ruby 1.8.7以上の場合:

a.each_with_index.max[1]

それは1回の繰り返しを行います。完全にこれまでで最も意味のあるものではありませんが、これを頻繁に実行している場合は、とにかくindex_of_maxメソッドでラップします。

108
Chuck

Ruby 1.9.2私はこれを行うことができます;

arr = [4, 23, 56, 7]
arr.rindex(arr.max)  #=> 2
14
eastafri

これが私がこの質問に答えようと思っていることです:

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
7
Arup Rakshit

ここにあるソリューションのいくつかの動作とパフォーマンスの違いに注意したいだけです。 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)がより良い選択であると思います。

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

少なくともRubyのようなものです:)

2
Jarrett Meyer

複数の場合、最大値のすべてのインデックス値を取得する方法は次のとおりです。

与えられた:

> 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]
1
dawg