我的元组下面的列表:
val arr = List(('a',10),('b',2),('c',3))
如何找到最大键或最大值的元组?
正确答案应该是(c, 3)
为最大键按字典顺序或('a', 10)
为最大值。
我的元组下面的列表:
val arr = List(('a',10),('b',2),('c',3))
如何找到最大键或最大值的元组?
正确答案应该是(c, 3)
为最大键按字典顺序或('a', 10)
为最大值。
十分简单:
scala> val list = List(('a',10),('b',2),('c',3))
list: List[(Char, Int)] = List((a,10), (b,2), (c,3))
scala> val maxByKey = list.maxBy(_._1)
maxByKey: (Char, Int) = (c,3)
scala> val maxByVal = list.maxBy(_._2)
maxByVal: (Char, Int) = (a,10)
因此,基本上可以提供至List[T]
的任何函数T => B
(其中B
可以是任何类型的命令,如Int
或String
作为例子),其将被用来找出最大。
毫无疑问,@ OM-NOM-NOM提供了一个简洁的,正确的答案。 然而,它会抛出一个异常的空单。
编辑#2鉴于我的第一个编辑,这是值得重新写我原来的,有缺陷的答案:
def max[A](list: List[(A, Int)]): Option[Int] = list match {
case Nil => None
case x :: xs => { val result = xs.foldLeft(x._2) { // acc = first item in list
(acc, elem) => if(elem._2 > acc) elem._2 else acc
}
Some(result)
}
}
注 :我猜scalaz将让您使用更普通的Num
般的类型,而不是Int
,但我还没有与它在所有的工作。
测试
scala> val list = List(('a',10),('b',2),('c',3))
list: List[(Char, Int)] = List((a,10), (b,2), (c,3))
scala> max(list)
res5: Option[Int] = Some(10)
scala> val list: List[(String, Int)] = Nil
list: List[(String, Int)] = List()
scala> max(list)
res6: Option[Int] = None
编辑对于选择一个初始值,我决定跟@交谈后编辑我的答案DustinGetz 。
采摘Int.MinValue
可能不是一个很好的选择,因为它是依赖于它的应用程序正在运行特定的OS /系统。
我认为,在列表中的第一个元素应该是开始值。 然而,有一个潜在的运行时异常,如果列表是空的。
请看一看这个职位更多的讨论- https://stackoverflow.com/a/23184020/409976 。
开始Scala 2.13
,稍微更安全的解决方案(其中处理空列表)将包括使用maxByOption
/ minByOption
返回None
如果序列是空的:
List(('a', 10),('b', 2),('c', 3)).maxByOption(_._1)
// Option[(Char, Int)] = Some((c,3))
List[(Char, Int)]().maxByOption(_._1)
// Option[(Char, Int)] = None
这样,您还可以决定回退到上的默认值时,该列表是空的:
List[(Char, Int)]().maxByOption(_._1).getOrElse(('a', 1))
// (Char, Int) = (a,1)