在Scala中获取一些[Long]的ListBuffer中的最大值

问题描述 投票:0回答:4

这段代码工作正常,并按预期返回343423:

val longList: ListBuffer[Long] = ListBuffer(103948,343423,209754)
val maxLong = longList.max

但它对某些[Long]不起作用:

val longSomeList: ListBuffer[Some[Long]] = ListBuffer(Some(103948),Some(343423),Some(209754))
val maxSomeLong = longSomeList.max

错误:没有为某些[Long]定义隐式排序。 val maxSomeLong = longSomeList.max

是否有任何简单的解决方案来获得第二个列表的最大值?

TraversableForwarder的最大函数(scala.collection.generic)

scala max scala-option listbuffer
4个回答
1
投票

您正在寻找.flatten

 longSomeList.flatten.max

或者给它明确使用的顺序:

 longSomeList
   .max(Ordering.by[Option[Int], Int](_.getOrElse(Int.MinValue)))

另外,不要使用可变集合。


2
投票

在哪个现实场景你会有ListBuffer[Some[Long]]?那么你也可以拥有一个ListBuffer[Long]

这有效:

val longSomeList: ListBuffer[Option[Long]] = ListBuffer(Some(103948),Some(343423),Some(209754))
val maxSomeLong = longSomeList.max

1
投票
longSomeList.collect { case Some(n) => n }.max

1
投票

问题是你正在尝试订购Some[Long]类型的元素,这是未定义的。所以你告诉编译器知道如何订购它们:

scala> Some(1) < Some(2)
<console>:8: error: value < is not a member of Some[Int]
              Some(1) < Some(2)
                      ^

你可以做的是打开Somes以获得Longs

longSomeList.flatten.max

或同样定义隐式排序:

implicit object Ord extends Ordering[Some[Long]] {
  def compare(a: Some[Long], b: Some[Long]) = a.getOrElse(Long.MinValue) compare b.getOrElse(Long.MinValue)
}

然后:

scala> longSomeList.max
res12: Some[Long] = Some(343423)
© www.soinside.com 2019 - 2024. All rights reserved.