Dans Ruby, quelle est la manière la plus propre d’obtenir l’index de la plus grande valeur dans 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 à tel ou tel endroit. De toute évidence, je suis nouveau sur Ruby.

Pour Ruby 1.8.7 ou supérieur:

 a.each_with_index.max[1] 

Il fait une itération. Ce n’est pas tout à fait la chose la plus sémantique, mais si vous vous retrouvez à faire ça beaucoup, je l’envelopperai dans une méthode index_of_max quand même.

Dans Ruby 1.9.2 je peux le faire;

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

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 
 a = [1, 4 8] a.inject(a[0]) {|max, item| item > max ? item : max } 

Au moins c’est comme Ruby 🙂

Je voulais juste noter une différence de comportement et de performance pour certaines des solutions ici. Le comportement de “tie break” des éléments max dupliqués :

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

Par curiosité, je les ai tous deux courus dans Benchmark.bm (pour l’ a ci a 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 avec Array.new(10_000_000) { Random.rand } et relance 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 qu’à moins que vous ayez spécifiquement besoin de choisir l’index supérieur, a.index(a.max) est le meilleur choix.

Voici un moyen d’obtenir toutes les valeurs d’index des valeurs max si plusieurs.

Donné:

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

Vous pouvez trouver l’index de toutes les valeurs max (ou de toute valeur donnée) en:

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