В Ruby, каков самый чистый способ получения индекса наибольшего значения в массиве? - PullRequest
50 голосов
/ 27 января 2010

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

Ответы [ 6 ]

106 голосов
/ 27 января 2010

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

a.each_with_index.max[1]

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

14 голосов
/ 28 октября 2011

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

arr = [4, 23, 56, 7]
arr.rindex(arr.max)  #=> 2
6 голосов
/ 29 августа 2015

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

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
3 голосов
/ 14 декабря 2017

Я просто хотел отметить разницу в поведении и производительности для некоторых решений здесь. Поведение «разрыва связи» дубликатов макс. Элементов:

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

2 голосов
/ 27 января 2010
a = [1, 4 8]
a.inject(a[0]) {|max, item| item > max ? item : max }

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

1 голос
/ 04 июля 2017

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

Дано:

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