我有以下元组列表:
val arr = List(('a',10),('b',2),('c',3))
如何找到具有最大键或最大值的元组?
正确的答案应该是(c, 3)
,用于按字典顺序排列最大键,或('a', 10)
表示最大值。
答案 0 :(得分:36)
易peasy:
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
这将用于找到最大值。
答案 1 :(得分:1)
毫无疑问,@ 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
可能不是一个好选择,因为它取决于运行该应用的特定操作系统/系统。
我认为列表中的第一个元素应该是起始值。但是,如果列表为空,则存在潜在的运行时异常。
请查看此帖子以获取更多讨论 - https://stackoverflow.com/a/23184020/409976。
答案 2 :(得分:0)
从PromiseJobs
开始,一个稍微安全些的解决方案(处理空列表)将包括使用maxByOption
/ Scala 2.13
,如果序列为空,则返回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