Comment puis-je trouver l'indice de la valeur maximale dans une Liste Scala?

pour une liste Scala [Int] je peux appeler la méthode max pour trouver la valeur maximale de l'élément.

Comment puis-je trouver l'index de l'élément maximum?

C'est ce que je fais maintenant:

val max = list.max 
val index = list.indexOf(max)
18
demandé sur om-nom-nom 2012-12-23 17:05:25

5 réponses

une façon de faire ceci est de zip la liste avec ses indices, trouver la paire résultante avec le plus grand premier élément, et retourner le deuxième élément de cette paire:

scala> List(0, 43, 1, 34, 10).zipWithIndex.maxBy(_._1)._2
res0: Int = 1

ce n'est pas la façon la plus efficace de résoudre le problème, mais c'est idiomatique et clair.

35
répondu Travis Brown 2012-12-23 13:30:55

Depuis Seq est une fonction de la Scala, le code suivant fonctionne:

list.indices.maxBy(list)
7
répondu Yuichiroh 2017-09-13 04:38:46

même plus facile à lire serait:

   val g = List(0, 43, 1, 34, 10)
   val g_index=g.indexOf(g.max)
1
répondu xhudik 2012-12-23 14:01:50
  def maxIndex[ T <% Ordered[T] ] (list : List[T]) : Option[Int] = list match {
    case Nil => None
    case head::tail => Some(
        tail.foldLeft((0, head, 0)){
            case ((indexOfMaximum, maximum, index), elem) =>
              if(elem > maximum) (index, elem, index + 1)
              else (indexOfMaximum, maximum, index + 1)
        }._1
    )
  }   //> maxIndex: [T](list: List[T])(implicit evidence: T => Ordered[T])Option[Int]


    maxIndex(Nil)                            //> res0: Option[Int] = None
    maxIndex(List(1,2,3,4,3))                //> res1: Option[Int] = Some(3)
    maxIndex(List("a","x","c","d","e"))      //> res2: Option[Int] = Some(1)

    maxIndex(Nil).getOrElse(-1)              //> res3: Int = -1
    maxIndex(List(1,2,3,4,3)).getOrElse(-1)  //> res4: Int = 3
    maxIndex(List(1,2,2,1)).getOrElse(-1)    //> res5: Int = 1

dans le cas où il y a plusieurs maximums, il retourne l'index du premier.

Pros: Vous pouvez l'utiliser avec plusieurs types, il passe par la liste qu'une seule fois, vous pouvez fournir un index par défaut au lieu d'obtenir l'exception pour les listes vides.

contre: peut-être préférez-vous les exceptions :) pas une seule doublure.

1
répondu Keyel 2012-12-24 10:19:01

Pimp Ma bibliothèque! :)

class AwesomeList(list: List[Int]) {
  def getMaxIndex: Int = {
    val max = list.max
    list.indexOf(max)
  }
}

implicit def makeAwesomeList(xs: List[Int]) = new AwesomeList(xs)
                                              //> makeAwesomeList: (xs: List[Int])scalaconsole.scratchie1.AwesomeList

//Now we can do this:
List(4,2,7,1,5,6) getMaxIndex             //> res0: Int = 2

//And also this:
val myList = List(4,2,7,1,5,6)            //> myList  : List[Int] = List(4, 2, 7, 1, 5, 6)
myList getMaxIndex                        //> res1: Int = 2

//Regular list methods also work
myList filter (_%2==0)                    //> res2: List[Int] = List(4, 2, 6)

Plus de détails à propos de ce modèle ici: http://www.artima.com/weblogs/viewpost.jsp?thread=179766

0
répondu Plasty Grove 2012-12-23 14:22:29