在Scala中合并两个数组

时间:2017-12-23 18:11:09

标签: scala

我的要求是:

arr1 : Array[(String, String)] = Array((bangalore,Kanata),  (kannur,Kerala)) 
arr2 : Array[(String, String)] = Array((001,anup), (002,sithu))

应该给我

Array((001,anup,bangalore,Krnata), (002,sithu,kannur,Kerala))

我试过了:

val arr3 = arr2.map(field=>(field,arr1))

但它没有工作

3 个答案:

答案 0 :(得分:2)

@nicodp's answer很好地解决了你的问题。 zip然后map将为您提供结果数组。

  

回想一下,如果一个列表比另一个列表大,则忽略其余的元素。   我的尝试试图解决这个问题:

考虑一下:

val arr1 =  Array(("bangalore","Kanata"),  ("kannur","Kerala"))

val arr2 = Array(("001","anup", "ramakrishan"), ("002","sithu", "bhattacharya"))

zip和元组上的映射会将结果显示为:

arr1.zip(arr2).map(field => (field._1._1, field._1._2, field._2._1, field._2._2))
Array[(String, String, String, String)] = Array((bangalore,Kanata,001,anup), (kannur,Kerala,002,sithu)) 
// This ignores the last field of arr2

在映射时,您可以转换迭代器中的元组并从中获取列表。这样,您就无法跟踪Tuple2Tuple3

arr1.zip(arr2).map{ case(k,v) => List(k.productIterator.toList, v.productIterator.toList).flatten }
// Array[List[Any]] = Array(List(bangalore, Kanata, 001, anup, ramakrishan), List(kannur, Kerala, 002, sithu, bhattacharya))

答案 1 :(得分:1)

您可以zip后跟map

scala> val arr1 = Array((1,2),(3,4))
arr1: Array[(Int, Int)] = Array((1,2), (3,4))

scala> val arr2 = Array((5,6),(7,8))
arr2: Array[(Int, Int)] = Array((5,6), (7,8))

scala> arr1.zip(arr2).map(field => (field._1._1, field._1._2, field._2._1, field._2._2))
res1: Array[(Int, Int, Int, Int)] = Array((1,2,5,6), (3,4,7,8))

map充当元组的展平位置,即采用((A, B), (C, D))类型的内容并将其映射到(A, B, C, D)

zip的作用是......呃,让我们看看它的类型:

def zip[B](that: GenIterable[B]): List[(A, B)]

因此,从那里,我们可以争辩说它需要一个可迭代的集合(可以是另一个列表)并返回一个列表,该列表是this: List[A]that: List[B]列表的相应元素的组合。回想一下,如果一个列表比另一个列表大,则忽略其余的元素。您可以在documentation

中详细了解列表函数

答案 2 :(得分:0)

我同意cleanes解决方案正在使用集合中的zip方法

val arr1 = Array(("bangalore","Kanata"),  ("kannur","Kerala"))
val arr2 = Array(("001","anup"), ("002","sithu"))

arr1.zip(arr2).foldLeft(List.empty[Any]) {
  case (acc, (a, b)) => acc ::: List(a.productIterator.toList ++ b.productIterator.toList)
}