首页 > 解决方案 > 将 Array[(Double,Double)] 转换为 Seq[Seq[Double]]

问题描述

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

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

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

标签: arraysscalatype-conversionseq

解决方案


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 trait 的事实,因此可以作为 的集合进行迭代Any

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

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

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


推荐阅读