如何在元组列表中找到最大值?

时间:2013-04-02 16:30:13

标签: scala

我有以下元组列表:

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

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

正确的答案应该是(c, 3),用于按字典顺序排列最大键,或('a', 10)表示最大值。

3 个答案:

答案 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可以是任何有序类型,例如IntString这将用于找到最大值。

答案 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