【问题标题】:Converting Array[(Double,Double)] to Seq[Seq[Double]]将 Array[(Double,Double)] 转换为 Seq[Seq[Double]]
【发布时间】:2018-12-18 21:15:40
【问题描述】:

我对 Scala 相当陌生,我必须使用一个函数,该函数将Seq[Seq[Double]] 类型的参数作为参数。但是,我的数据类型为 Array[(Double,Double)]

我尝试使用.toSeq 转换数据,但不起作用。

在这方面的任何修复将不胜感激。谢谢!

【问题讨论】:

    标签: arrays scala type-conversion seq


    【解决方案1】:
    val input: Array[(Double, Double)] = ...
    val output: Seq[Seq[Double]] = input.map { case (x, y) => Seq(x, y) }
    

    不幸的是,标准库中没有通用的方法可以将元组类型安全地转换为列表。但是,shapeless 确实提供了这个功能:

    import shapeless.syntax.std.tuple._
    
    val input: Array[(Double, Double)] = ...
    val output: Seq[Seq[Double]] = input.map(_.toList)
    

    Shapeless 足够聪明,可以计算出最低上限,以防您的元组包含不同类型的组件:

    val input: Array[(Double, Int)] = ...
    // AnyVal is the closest type which both Double and Int are subtypes of
    val output: Seq[Seq[AnyVal]] = input.map(_.toList)
    

    最后,有一种非类型安全的方法可以仅使用标准库工具来执行此操作。您可以相信 Scala 中的所有元组都实现了 Product 特征,因此可以作为 Any 的集合进行迭代:

    val input: Array[(Double, Double)] = ...
    val output: Seq[Seq[Double]] = input.map(_.productIterator.toSeq.asInstanceOf[Seq[Double]])
    

    只要你小心,这是安全的,但它确实需要显式强制转换并且更冗长。

    如果您有相对较小的固定长度元组,那么我会说最好使用基于部分函数的方法。否则,这取决于你,但我会使用 shapeless,因为它是类型安全的,而且我在我的许多项目中也使用 shapeless 来做其他事情,所以它对我来说是免费的 :)

    【讨论】:

      猜你喜欢
      • 2019-07-08
      • 2016-06-29
      • 2017-12-29
      • 2015-01-09
      • 2015-02-04
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多