在 Scala 的 Some[Long] 的 ListBuffer 中获取最大值
Get max in a ListBuffer of Some[Long] in Scala
这段代码工作正常,returns 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
Error: No implicit Ordering defined for Some[Long].
val maxSomeLong = longSomeList.max
是否有任何简单的解决方案来获取第二个列表的最大值?
来自 TraversableForwarder 的最大函数(scala.collection.generic)
longSomeList.collect { case Some(n) => n }.max
您正在寻找 .flatten
。
longSomeList.flatten.max
或者给它明确的使用顺序:
longSomeList
.max(Ordering.by[Option[Int], Int](_.getOrElse(Int.MinValue)))
另外,不要使用可变集合。
您会在哪种现实世界场景中使用 ListBuffer[Some[Long]]
?那你也可以有一个ListBuffer[Long]
。
这个有效:
val longSomeList: ListBuffer[Option[Long]] = ListBuffer(Some(103948),Some(343423),Some(209754))
val maxSomeLong = longSomeList.max
问题是您正在尝试对未定义的 Some[Long]
类型的元素进行排序。所以你告诉编译器知道如何订购这些:
scala> Some(1) < Some(2)
<console>:8: error: value < is not a member of Some[Int]
Some(1) < Some(2)
^
你可以做的是打开 Some
s 得到 Long
s
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)
这段代码工作正常,returns 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
Error: No implicit Ordering defined for Some[Long].
val maxSomeLong = longSomeList.max
是否有任何简单的解决方案来获取第二个列表的最大值?
来自 TraversableForwarder 的最大函数(scala.collection.generic)
longSomeList.collect { case Some(n) => n }.max
您正在寻找 .flatten
。
longSomeList.flatten.max
或者给它明确的使用顺序:
longSomeList
.max(Ordering.by[Option[Int], Int](_.getOrElse(Int.MinValue)))
另外,不要使用可变集合。
您会在哪种现实世界场景中使用 ListBuffer[Some[Long]]
?那你也可以有一个ListBuffer[Long]
。
这个有效:
val longSomeList: ListBuffer[Option[Long]] = ListBuffer(Some(103948),Some(343423),Some(209754))
val maxSomeLong = longSomeList.max
问题是您正在尝试对未定义的 Some[Long]
类型的元素进行排序。所以你告诉编译器知道如何订购这些:
scala> Some(1) < Some(2)
<console>:8: error: value < is not a member of Some[Int]
Some(1) < Some(2)
^
你可以做的是打开 Some
s 得到 Long
s
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)