将阵列[(double,double)]转换为seq [seq [double]]



我是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]])

只要您小心,这是安全的,但是确实需要明确的演员,并且更详细。

如果您的尺寸相对较小的固定长度,那么我会说最好使用基于部分功能的方法。否则,它取决于您,但我会使用无形的,因为它是安全的,我也可以在许多项目中使用无形的其他事情,因此对我来说是免费的:)

最新更新