对于Scala List [Int]我可以调用max方法来查找最大元素值。如何在Scala中找到列表中最大值的索引?
如何找到最大元素的索引?
这就是我现在所做的:
val max = list.max
val index = list.indexOf(max)
对于Scala List [Int]我可以调用max方法来查找最大元素值。如何在Scala中找到列表中最大值的索引?
如何找到最大元素的索引?
这就是我现在所做的:
val max = list.max
val index = list.indexOf(max)
的一种方式做到这一点是要压缩其索引列表中,找到所产生的对与最大的第一个元素,并返回的第二元素对:
scala> List(0, 43, 1, 34, 10).zipWithIndex.maxBy(_._1)._2
res0: Int = 1
这不是解决问题的最有效的方法,但它的惯用和清晰。
该死的,正是我刚才说的...我添加了一个案例 'x.zipWithIndex.maxBy {case(i,v)=> v} ._ 2' – 2012-12-23 20:18:10
更容易阅读是:
val g = List(0, 43, 1, 34, 10)
val g_index=g.indexOf(g.max)
皮条客我的图书馆! :)
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
虽然很容易写,不是吗?两次浏览列表? –
是的你是对的。我有一种通过列表获得最大值的方法,但我认为可读性对此有很大的影响。此外,它涉及使用myList(索引)来获取特定项目,我不知道这是多高效 –
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$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
的情况下有多个最大值,它返回的第一个索引。优点:你可以在多种类型中使用它,它只经历一次列表,你可以提供一个默认索引,而不是空列表的异常。
缺点:也许你更喜欢例外情况:)不是一句话。
由于Seq
是Scala的功能,下面的代码工作:
list.indices.maxBy(list)
听起来像一个奇怪的使用情况。也许使用需要一个有序的数据结构? – andyczerwonka
是的,你有一个关于奇怪用例的观点,你可以说这是“代码异味”,因为在首先生成列表时可以找到最大值。在这个小空间里没有足够的空间来解释为什么它看起来不对,也许我会在稍后更新答案。 – Phil