将第一个列表的元素分配给另一个列表/数组

时间:2015-12-07 04:32:07

标签: scala scala-collections

我有Array[(List(String)), Array[(Int, Int)]]这样的

 ((123, 456, 789), (1, 24))
 ((89, 284), (2, 6))
 ((125, 173, 88, 222), (3, 4))

我想将第一个列表的每个元素分发到第二个列表,如此

 (123, (1, 24))
 (456, (1, 24))
 (789, (1, 24))
 (89, (2, 6))
 (284, (2, 6))
 (125, (3, 4))
 (173, (3, 4))
 (88, (3, 4))
 (22, (3, 4))

任何人都可以帮我吗?非常感谢你。

2 个答案:

答案 0 :(得分:5)

对于如下定义的输入数据:

val data = Array((List("123", "456", "789"), (1, 24)), (List("89", "284"), (2, 6)), (List("125", "173", "88", "222"), (3, 4)))

你可以使用:

data.flatMap { case (l, ii) => l.map((_, ii)) }

产生:

Array[(String, (Int, Int))] = Array(("123", (1, 24)), ("456", (1, 24)), ("789", (1, 24)), ("89", (2, 6)), ("284", (2, 6)), ("125", (3, 4)), ("173", (3, 4)), ("88", (3, 4)), ("222", (3, 4)))

我认为这与你要找的东西相符。

答案 1 :(得分:2)

根据您的示例,我觉得您使用的是单一类型。

scala> val xs: List[(List[Int], (Int, Int))] = 
     |   List( ( List(123, 456, 789), (1, 24) ), 
     |         ( List(89, 284), (2,6)), 
     |         ( List(125, 173, 88, 222), (3, 4)) )
xs: List[(List[Int], (Int, Int))] = List((List(123, 456, 789), (1,24)),
                                         (List(89, 284),(2,6)),
                                         (List(125, 173, 88, 222),(3,4)))

然后我写了这个函数:

scala> def f[A](xs: List[(List[A], (A, A))]): List[(A, (A, A))] = 
     |     for {
     |       x    <- xs
     |       head <- x._1
     |     } yield (head, x._2)
f: [A](xs: List[(List[A], (A, A))])List[(A, (A, A))]

f应用于xs

scala> f(xs)
res9: List[(Int, (Int, Int))] = List((123,(1,24)), (456,(1,24)), 
             (789,(1,24)), (89,(2,6)), (284,(2,6)), (125,(3,4)), 
                 (173,(3,4)), (88,(3,4)), (222,(3,4)))