22

对于 Scala List[Int] 我可以调用方法 max 来查找最大元素值。

如何找到最大元素的索引?

这就是我现在正在做的事情:

val max = list.max 
val index = list.indexOf(max)
4

6 回答 6

43

一种方法是使用其索引压缩列表,找到具有最大第一个元素的结果对,并返回该对的第二个元素:

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

这不是解决问题的最有效方法,但它是惯用且清晰的。

于 2012-12-23T13:30:55.013 回答
14

由于Seq是 Scala 中的函数,因此以下代码有效:

list.indices.maxBy(list)
于 2017-09-13T04:38:46.410 回答
3
  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

如果有多个最大值,则返回第一个的索引。

优点:您可以将它与多种类型一起使用,它只通过列表一次,您可以提供默认索引而不是为空列表获取异常。

缺点:也许你更喜欢例外 :) 不是单行的。

于 2012-12-24T03:25:36.253 回答
2

更容易阅读的是:

   val g = List(0, 43, 1, 34, 10)
   val g_index=g.indexOf(g.max)
于 2012-12-23T14:01:50.170 回答
1

我认为这里介绍的大多数解决方案都会通过列表两次(或平均 1.5 次)——一次用于最大位置,另一个用于最大位置。也许很多注意力都集中在看起来漂亮的东西上?

为了只通过一次非空列表,可以尝试以下操作:

list.foldLeft((0, Int.MinValue, -1)) {
    case ((i, max, maxloc), v) => 
        if (v > max) (i + 1, v, i)
        else (i + 1, max, maxloc)}._3
于 2021-03-29T17:34:56.180 回答
0

拉皮条我的图书馆!:)

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

于 2012-12-23T14:22:29.813 回答