Scala List [Int]の場合、メソッドmaxを呼び出して、最大要素値を見つけることができます。
最大要素のインデックスを見つけるにはどうすればよいですか?
これは私が今していることです:
val max = list.max
val index = list.indexOf(max)
Scala List [Int]の場合、メソッドmaxを呼び出して、最大要素値を見つけることができます。
最大要素のインデックスを見つけるにはどうすればよいですか?
これは私が今していることです:
val max = list.max
val index = list.indexOf(max)
これを行う1つの方法は、リストをそのインデックスで圧縮し、最初の要素が最大の結果のペアを見つけて、そのペアの2番目の要素を返すことです。
scala> List(0, 43, 1, 34, 10).zipWithIndex.maxBy(_._1)._2
res0: Int = 1
これは問題を解決するための最も効率的な方法ではありませんが、慣用的で明確です。
はScalaの関数なのでSeq
、次のコードが機能します。
list.indices.maxBy(list)
def maxIndex[ T <% Ordered[T] ] (list : List[T]) : Option[Int] = list match {
case Nil => None
case head::tail => Some(
tail.foldLeft((0, head, 1)){
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$2: 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
最大値が複数ある場合は、最初のインデックスを返します。
長所:これは複数のタイプで使用でき、リストを1回だけ通過し、空のリストの例外を取得する代わりにデフォルトのインデックスを指定できます。
短所:たぶんあなたは例外を好むでしょう:)ワンライナーではありません。
さらに読みやすくなります:
val g = List(0, 43, 1, 34, 10)
val g_index=g.indexOf(g.max)
ここで紹介するソリューションのほとんどは、リストを2回(または平均1.5回)通過すると思います。1回は最大、もう1回は最大位置です。おそらく、きれいに見えるものに多くの焦点が当てられていますか?
空でないリストを1回だけ通過するには、次のことを試すことができます。
list.foldLeft((0, Int.MinValue, -1)) {
case ((i, max, maxloc), v) =>
if (v > max) (i + 1, v, i)
else (i + 1, max, maxloc)}._3
私の図書館をポン引き!:)
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)
このパターンの詳細については、http ://www.artima.com/weblogs/viewpost.jsp?thread=179766をご覧ください。