Scala:如何使元组的数组变平



我正试图在scala上压平以下结构:

Array[((String, String, String),(String, String, String))]

获取:

(String, String, String, String, String, String)

到目前为止,我尝试了类似的东西:

val  = payload.map(_.productIterator.toList.map(_.toString)).toList

产生:List[List[String]]

关于如何实现这一点,有什么想法吗?

谢谢!

元组不是一种可以轻易扁平化的东西——Scala 3提供了连接它们的方法:

val xs: Array[((String, String, String),(String, String, String))]
xs.map { case (t1, t2) =>
t1 ++ t2
} // Array[(String, String, String, String, String, String)]

但在Scala 2中,您必须手动组合它们

val xs: Array[((String, String, String),(String, String, String))]
xs.map { case ((a, b, c), (d, e, f)) =>
(a, b, c, d, e, f)
} // Array[(String, String, String, String, String, String)]

一旦你有了元组数组。。。你仍然不能";只是";扁平化它,因为将数组中的所有元组组合为一个元组的直观、内置、默认方式是什么?你可以这样做,例如使用foldLeft/foldRight/reduce,但你仍然需要告诉如何:

val xs2: Array[(String, String, String, String, String, String)]
xs2.foldLeft(initialValue) { (tuple1, tuple) =>
// your definition how to combine them
}

例如,如果您想在相应的位置上连接值

val xs: Array[((String, String, String),(String, String, String))]
xs.map { case ((a, b, c), (d, e, f)) =>
(a, b, c, d, e, f)
}.foldLeft(("", "", "", "", "", "")) {
case ((a1,b1,c1,d1,e1,f1), (a2,b2,c2,d2,e2,f2)) =>
(a1+a2, b1+b2, c1+c2, d1+d2, e1+e2, f1+f2)
} // (String, String, String, String, String, String)

它也可以在一个步骤中完成:

val xs: Array[((String, String, String),(String, String, String))]
xs.foldLeft(("", "", "", "", "", "")) {
case ((a1,b1,c1,d1,e1,f1), ((a2,b2,c2),(d2,e2,f2))) =>
(a1+a2, b1+b2, c1+c2, d1+d2, e1+e2, f1+f2)
} // (String, String, String, String, String, String)

但具体的实现取决于你对";扁平化";元组的元组数组。

您可以使用productIterator,但由于它返回Any,您需要在您拥有的类型上匹配:

val x=Seq((("A","B","C"),("D","E","F")),(("A1","B1","C1"),("D1","E1","F1")))
x.flatMap(_.productIterator
.flatMap{
case ys:(String, String, String)=>
ys.productIterator.map{ 
case xs:String => xs 
}})
res0: Seq[String] = List(A, B, C, D, E, F, A1, B1, C1, D1, E1, F1)

最新更新