Подтвердить что ты не робот

В Ruby, какой самый чистый способ получить индекс наибольшего значения в массиве?

Если a - это массив, я хочу a.index(a.max), но что-то более похожее на Ruby. Это должно быть очевидно, но мне трудно найти ответ так и в другом месте. Очевидно, я новичок в Ruby.

4b9b3361

Ответ 1

Для Ruby 1.8.7 или выше:

a.each_with_index.max[1]

Он выполняет одну итерацию. Не совсем самая семантическая вещь, но если вы так много сделаете, я все равно обернул бы ее методом index_of_max.

Ответ 2

В ruby ​​1.9.2 я могу это сделать;

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

Ответ 3

Вот что я думаю, чтобы ответить на этот вопрос:

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

Ответ 4

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

По крайней мере, он похож на Ruby:)

Ответ 5

Вот способ получить все значения индекса максимальных значений, если более одного.

Дано:

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

Ответ 6

Просто хотелось отметить различия в поведении и производительности для некоторых решений здесь. Поведение "нарушение связи" дубликатов:

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)

Затем я сгенерировал новый a с Array.new(10_000_000) { Random.rand } и повторил тест:

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) - лучший выбор.