Scala: 将 Array[(String, Array[Double])] 压缩为 Array[(String)]

3
我有一个看起来像这样的数组:Array((1,Array(1.0,0.0,3.0)), (2,Array(0.0,2.0,1.0)))。我想把它转换成一个看起来像这样的数组:Array((1,1.0,0.0,3.0),(2,0.0,2.0,1.0))。有没有简便的方法可以做到这一点?我猜应该有一些映射(map)的语法,但我还没能弄清楚。谢谢!

最近有其他人提出了一个几乎相同的问题,只是我现在找不到它。你能详细说明一下需要这个代码的应用场景吗? - The Archetypal Paul
2个回答

4
您可以这样做:
a.map { case (a, Array(b,c,d)) => (a,b,c,d) }

scala> val a = Array((1,Array(1.0,0.0,3.0)), (2,Array(0.0,2.0,1.0)))
a: Array[(Int, Array[Double])] = Array((1,Array(1.0, 0.0, 3.0)), (2,Array(0.0, 2.0, 1.0)))

scala> a.map({ case (a, Array(b,c,d)) => (a,b,c,d) })
res4: Array[(Int, Double, Double, Double)] = Array((1,1.0,0.0,3.0), (2,0.0,2.0,1.0))

一种支持多达22元组的解决方案。当然,即使这种方法也需要假设所有数组成员具有相同的长度。

a.map {
  case (a, Array(b))           => (a,b)
  case (a, Array(b,c))         => (a,b,c)
  case (a, Array(b,c,d))       => (a,b,c,d)
  // pseudo-scala
  case (n1, Array(n2,...,n22)) => (n1,n2,...,n22)
}

当内部数组的大小大于100时,你该如何展平它? - eliasah
这很好,唯一的问题是数组中的元素数量可能因我提供给生成数组函数的数据而异(但在任何给定的数组实例中都是一致的)。所以我可能有Array((1,Array(1,2,3)),(2,Array(2,3,4)),但稍后可能会有Array((1,Array(1,2)),(2,Array(2,3))。是否有一种方法可以在case语句中泛化数组的表达式?我是Scala的新手,不理解所有语法的细微差别。谢谢。 - J Calbreath
@JCalbreath 鉴于在Scala中元组支持多达22个元素,您始终可以列出所有22种可能的情况。为了实现更高的可扩展性,您需要开始使用HList实现,例如shapeless库中的实现。不过我对此没有经验。 - Ionuț G. Stan
@JCalbreath,你确定不想构建Array实例而不是元组实例吗?例如:Array(1, Array(2,3,4))将变为Array(Array(1,2,3,4))。对于具有同质元素类型的集合来说,使用HList会过度。 - Ionuț G. Stan
我现在对任何事情都不太确定 :) 我认为数组实例应该可以正常工作。 - J Calbreath

3

请指定输入和输出的类型。我理解这个任务是将Array [String,Array [Double]] => Array [Array [Double]]。

 scala> val r = Array(("1", Array(1.0, 2.0, 1.0, 0.0, 3.0)), ("2", Array(0.0, 2.0, 1.0)))
r: Array[(String, Array[Double])] = Array((1,Array(1.0, 2.0, 1.0, 0.0, 3.0)), (2,Array(0.0, 2.0, 1.0)))

scala> val res = r map { case (s, Array(xs @ _*)) => (s.toDouble +: xs).toArray }
res: Array[Array[Double]] = Array(Array(1.0, 1.0, 2.0, 1.0, 0.0, 3.0), Array(2.0, 0.0, 2.0, 1.0))

这正带我去想要到达的地方。输出数据类型并不完全符合我的要求(第一个元素应该是字符串,而不是Double,但从我给出的示例中无法判断),但这很容易改变。你能解释一下 "Array(xs @ _)" 的含义吗?特别是 "@ _" 是在做什么?非常感谢! - J Calbreath
请查看此处关于“@ _*”的内容:http://docs.scala-lang.org/tutorials/FAQ/finding-symbols.html。大致来说,这是一种将数组解开为可变参数扩展的方法。 - hellraiser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接