arrays - 将 Array[(Double,Double)] 转换为 Seq[Seq[Double]]
问题描述
我对 Scala 相当陌生,我必须使用一个函数,该函数将 type 的参数作为参数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) }
不幸的是,标准库中没有通用的方法可以将元组安全地转换为列表。但是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 来做其他事情,所以它对我来说是免费的 :)
推荐阅读
- airflow - 气流 HdfsSensor 未检测到
- javascript - 使用特定的 CSS (clipboard.js) 将表格复制并粘贴到 MS Word
- hibernate - 查询多对多连接表时出现Jpa休眠问题
- javascript - 在一个页面上使用多个 Slick 幻灯片
- reactjs - 道具类型失败:提供给“组”的“函数”类型的无效道具“元素”,应为“对象”
- python - 在heroku中没有收到电报验证码
- javascript - Next.js 访问 getServerSideProps 方法内的 Page props
- amazon-web-services - 使用 AWS Athena 创建指向 S3 存储桶中多个子文件夹的表
- latex - 在编译为 PDF 和 HTML 的 R markdown 文件中使用高级引用命令(例如,citetitle、citeauthor、来自 biblatex/natbib 的 footcite)
- javascript - 计算在由 javascript 动态创建的 HTML 字段中不起作用