Если a
- это массив, я хочу a.index(a.max)
, но что-то более похожее на Ruby. Это должно быть очевидно, но мне трудно найти ответ так и в другом месте. Очевидно, я новичок в Ruby.
В Ruby, какой самый чистый способ получить индекс наибольшего значения в массиве?
Ответ 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)
- лучший выбор.