如何使用scala从两个列表中获取组合列表?

时间:2014-11-21 10:12:55

标签: scala scala-collections

我有两个列表

val list1 = List((List("AAA"),"B1","C1"),(List("BBB"),"B2","C2"))
val list2 = List(("AAA",List("a","b","c")),("BBB",List("c","d","e")))

我希望将list2中的第一个元素与list1的第一个元素进行匹配,并获得组合列表。 我希望输出为 -

List((List("AAA"),"B1","C1",List("a","b","c")))

如何使用Scala获得上述输出?

2 个答案:

答案 0 :(得分:0)

这就是我提出的:

scala> val l1 = List((List("AAA"),"B1","C1"),(List("BBB"),"B2","C2"))
l1: List[(List[String], String, String)] = List((List(AAA),B1,C1), (List(BBB),B2,C2))

scala> val l2 = List((List("AAA"), List("a", "b", "c")), (List("BBB"), List("c", "d", "e")))
l2: List[(String, List[String])] = List((AAA,List(a, b, c)), (BBB,List(c, d, e)))

scala>  l1.collectFirst {
     |    case tp => l2.find(tp2 => tp2._1.head == tp._1.head).map(founded => (tp._1, tp._2, tp._3, founded._2))
     |  }.flatten
res2: Option[(List[String], String, String, List[String])] = Some((List(AAA),B1,C1,List(a, b, c)))

您可以使用collectFirst过滤您不想要的值以及您在第二个列表中使用find的每个元组,并将其映射到您想要的元组。

有几个笔记,这太可怕了,我不知道你是如何得到Tuple4的,我个人讨厌所有tp._*符号,这很难读,想想关于使用案例类将所有这些包装到一些更易于管理的结构中,第二个我不得不使用.head,如果空列表会抛出异常,所以你可能想在此之前做一些检查,但正如我所说,我会完全检查我的代码,并避免花时间在一些有缺陷的架构上工作。

答案 1 :(得分:0)

您可以使用zip组合列表

val list1 = List((List("AAA"),"B1","C1"),(List("BBB"),"B2","C2"))
val list2 = List(("AAA",List("a","b","c")),("BBB",List("c","d","e")))

val combinedList = (list1 zip list2) 
combinedList.head will give you the desired result

它将给出组合列表,您可以从中获取第一个元素