我是Scala的新手,我必须使用一个函数,该函数将作为Seq[Seq[Double]]
类型的参数。但是,我的数据具有Array[(Double,Double)]
类型。
我尝试使用.toSeq
转换数据,但这行不通。
在这方面的任何解决方案都将不胜感激。谢谢!
val input: Array[(Double, Double)] = ...
val output: Seq[Seq[Double]] = input.map { case (x, y) => Seq(x, y) }
不幸的是,没有通用方法可以将元组转换为标准库中的列表。但是,无形提供了此功能:
import shapeless.syntax.std.tuple._
val input: Array[(Double, Double)] = ...
val output: Seq[Seq[Double]] = input.map(_.toList)
无形的人足够聪明,可以计算最低的上限,以防您的元组包含不同类型的组件:
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中的所有元组都实现了产品特征,因此可以作为Any
的集合:
val input: Array[(Double, Double)] = ...
val output: Seq[Seq[Double]] = input.map(_.productIterator.toSeq.asInstanceOf[Seq[Double]])
只要您小心,这是安全的,但是确实需要明确的演员,并且更详细。
如果您的尺寸相对较小的固定长度,那么我会说最好使用基于部分功能的方法。否则,它取决于您,但我会使用无形的,因为它是安全的,我也可以在许多项目中使用无形的其他事情,因此对我来说是免费的:)