将Array [(Double,Double)]转换为Seq [Seq [Double]]

时间:2018-12-18 21:15:41

标签: arrays scala type-conversion seq

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

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

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

1 个答案:

答案 0 :(得分:4)

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用于其他用途,因此它对我来说是免费的:)