web-dev-qa-db-fra.com

Dans Ruby, quelle est la manière la plus propre d'obtenir l'indice de la plus grande valeur d'un tableau?

Si a est le tableau, je veux a.index(a.max), mais quelque chose de plus comme Ruby. Cela devrait être évident, mais j'ai du mal à trouver la réponse à so et ailleurs. Évidemment, je suis nouveau chez Ruby.

52
Cary Swoveland

Pour Ruby 1.8.7 ou supérieur:

a.each_with_index.max[1]

Il fait une itération. Pas tout à fait la chose la plus sémantique de tous les temps, mais si vous vous retrouvez à faire ça souvent, je l'envelopperais dans un index_of_max méthode quand même.

108
Chuck

Dans Ruby 1.9.2 je peux le faire;

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

Voici ce que je pense pour répondre à cette question:

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

Je voulais juste noter une différence de comportement et de performances pour certaines des solutions ici. Le comportement de "rupture de lien" de en double éléments max:

a = [3,1,2,3]
a.each_with_index.max[1]
# => 3
a.index(a.max)
# => 0

Par curiosité, je les ai exécutés tous les deux dans Benchmark.bm (Pour le a ci-dessus):

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)

Ensuite, j'ai généré un nouveau a avec Array.new(10_000_000) { Random.Rand } et relancé le test:

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)

Cela me fait penser à moins que vous n'ayez spécifiquement besoin de choisir l'index max le plus élevé, a.index(a.max) est le meilleur choix.

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

Au moins, c'est comme Ruby :)

2
Jarrett Meyer

Voici un moyen d'obtenir toutes les valeurs d'index des valeurs maximales si plusieurs.

Donné:

> a
=> [1, 2, 3, 4, 5, 6, 7, 9, 9, 2, 3]

Vous pouvez trouver l'index de toutes les valeurs maximales (ou toute valeur donnée) par:

> a.each_with_index.select {|e, i| e==a.max}.map &:last
=> [7, 8]
1
dawg