【问题标题】:How to get combined lists from two list using scala?如何使用scala从两个列表中获取组合列表?
【发布时间】:2015-01-19 10:51:46
【问题描述】:

我有两个列表

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 获得以上输出??

【问题讨论】:

  • list2 不是有效列表;也许你可以解决这个问题,我们可以从那里开始?具体来说,这些方括号在这种情况下毫无意义。
  • 你现在能看看我的编辑吗..
  • 您能否提供更多示例或改写您想要的内容? “list2 中的第一个元素与 list1 的第一个元素并获得组合列表”将是 List((List("AAA"),"B1","C1"), ("AAA",List("a","b" ,"c"))) 而不是您提供的列表。

标签: scala scala-collections


【解决方案1】:

这是我想出的:

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,如果列表为空,则会引发异常,因此您可能需要在此之前进行一些检查,但正如我所说,我会彻底检查我的代码并避免首先花时间在一些有缺陷的架构上。

【讨论】:

  • 第二个列表与您的第二个列表略有不同
  • 对不起,我错过了你只想要第一场比赛,你可以用collectFirst代替collect
  • 我赞同 Ende 的建议,将原始数据转换为更合理的数据结构。
【解决方案2】:

您可以使用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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-09
    • 2011-11-29
    • 2015-01-19
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2023-03-19
    相关资源
    最近更新 更多