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)
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.
Depuis Seq
est une fonction de la Scala, le code suivant fonctionne:
list.indices.maxBy(list)
même plus facile à lire serait:
val g = List(0, 43, 1, 34, 10)
val g_index=g.indexOf(g.max)
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.
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