【问题标题】:Get max in a ListBuffer of Some[Long] in Scala在 Scala 中的 Some[Long] 的 ListBuffer 中获取最大值
【发布时间】:2017-12-31 14:31:09
【问题描述】:

这段代码运行良好,按预期返回 343423:

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

但它不适用于 Some[Long]:

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

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

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

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

【问题讨论】:

    标签: scala max scala-option listbuffer


    【解决方案1】:

    在哪种现实世界场景中,您会拥有ListBuffer[Some[Long]]?那你也可以有一个ListBuffer[Long]。

    这行得通:

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

    【讨论】:

    • 我有一个 json 文件,它被解析为 Some[Long] 的列表。没错,它适用于 Option[Long]。这太令人困惑了:D 我需要学习一些基础知识。
    • 哪个库将其解析为Some[Long]?如果您静态地知道它始终是Some,那么拥有额外的拳击水平是没有意义的。
    • 我使用 scala.util.parsing.json._ 中的 parseFull 总是得到 Some。你有什么建议吗?
    • 我不是 JSON 解析领域的专家,但我认为 scala.util.parsing.json 是一个已弃用的 API,因为它从未真正用于生产用途。
    【解决方案2】:

    您正在寻找.flatten。

     longSomeList.flatten.max
    

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

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

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

    【讨论】:

      【解决方案3】:
      longSomeList.collect { case Some(n) => n }.max
      

      【讨论】:

        【解决方案4】:

        问题是您正在尝试订购未定义的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)
        

        【讨论】:

          猜你喜欢
          • 2023-04-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-23
          相关资源
          最近更新 更多