我的要求是:
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))
但它没有工作
答案 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
在映射时,您可以转换迭代器中的元组并从中获取列表。这样,您就无法跟踪Tuple2
或Tuple3
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)
}