如何在Scala中找到列表中最大值的索引?

如何在Scala中找到列表中最大值的索引?,scala,indexing,max,scala-collections,Scala,Indexing,Max,Scala Collections,对于Scala列表[Int],我可以调用max方法来查找最大元素值 如何找到最大元素的索引 这就是我现在正在做的: val max = list.max val index = list.indexOf(max) 一种方法是使用索引压缩列表,找到第一个元素最大的结果对,然后返回该对的第二个元素: scala> List(0, 43, 1, 34, 10).zipWithIndex.maxBy(_._1)._2 res0: Int = 1 这不是解决问题的最有效的方法,但它非常地道和清

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

如何找到最大元素的索引

这就是我现在正在做的:

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

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

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

这不是解决问题的最有效的方法,但它非常地道和清晰。

更容易阅读的是:

   val g = List(0, 43, 1, 34, 10)
   val g_index=g.indexOf(g.max)
拉皮条我的图书馆!:)

有关此模式的更多详细信息,请参见此处:

defmaxindex[T无
case head::tail=>Some(
尾部折叠(0,头部,1)){
大小写((索引最大值、最大值、索引),元素)=>
如果(元素>最大值)(索引,元素,索引+1)
其他(索引最大值、最大值、索引+1)
}._1
)
}//>maxIndex:[T](list:list[T])(隐式证据$2:T=>Ordered[T])选项[Int]
maxIndex(Nil)/>res0:Option[Int]=None
maxIndex(List(1,2,3,4,3))/>res1:Option[Int]=Some(3)
maxIndex(列表(“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
如果存在多个最大值,则返回第一个最大值的索引

优点:您可以将其用于多种类型,它只遍历列表一次,您可以提供默认索引,而不是获取空列表的异常


缺点:可能您更喜欢例外:)而不是一行程序。

因为
Seq
是Scala中的一个函数,下面的代码可以工作:

list.indices.maxBy(list)

我认为这里介绍的大多数解决方案都会在列表中经过两次(平均1.5次)——一次是针对max,另一次是针对max位置。也许很多注意力都集中在什么看起来漂亮

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

list.foldLeft((0, Int.MinValue, -1)) {
    case ((i, max, maxloc), v) => 
        if (v > max) (i + 1, v, i)
        else (i + 1, max, maxloc)}._3

听起来像是一个奇怪的用例。也许用例需要一个排序的数据结构?是的,你有一个关于奇怪用例的观点,你可以说这是“代码气味”因为在第一次生成列表时可能已经找到了最大值。没有足够的空间来解释为什么在这个小空间中它看起来是错误的,也许我以后会更新答案。虽然写起来很容易,但它不是要遍历列表两次吗?是的,你是对的。我有一种方法可以在列表的一次迭代中获得最大值,但我认为可读性受到了很大的影响。此外,它涉及到使用myList(索引)获取特定的项目,我不确定isdamn的效率有多高,这正是我要说的……我添加了一个case
x.zipWithIndex.maxBy{case(I,v)=>v}.\u 2
Hi,我在哪里可以读到抱歉问的意思。
maxIndex(List(1,2,3,4,5))
products index=3-这是因为,从字面上看,您缺少了一个“head case”,而5未选中。您好!感谢您提醒我错误的代码!foldLeft参数中有一个错误。我刚刚将其从(0,head,0)编辑到(0,head,1).Sry,我的错误。head case由head::tail覆盖,tail可以是Nil,在这种情况下foldLeft将返回(0,head,1),maxIndex将按预期返回0。启动
Scala 2.13
,处理空列表的版本可以是:
list.index.maxByOption(list)
list.indices.maxBy(list)
list.foldLeft((0, Int.MinValue, -1)) {
    case ((i, max, maxloc), v) => 
        if (v > max) (i + 1, v, i)
        else (i + 1, max, maxloc)}._3