如何找到最大的元组的列表?(How to find max in a list of tuples?

2019-08-19 02:18发布

我的元组下面的列表:

val arr = List(('a',10),('b',2),('c',3))

如何找到最大键或最大值的元组?

正确答案应该是(c, 3)为最大键按字典顺序或('a', 10)为最大值。

Answer 1:

十分简单:

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可以是任何类型的命令,如IntString作为例子),其将被用来找出最大。



Answer 2:

毫无疑问,@ 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 。



Answer 3:

开始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)


文章来源: How to find max in a list of tuples?
标签: scala