首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从另一个列表中查找包含任何值的列表,并使用scala创建组合列表?

问如何从另一个列表中查找包含任何值的列表,并使用scala创建组合列表?
EN

Stack Overflow用户
提问于 2015-02-06 15:40:18
回答 3查看 1.7K关注 0票数 1

我有以下两个列表-

代码语言:javascript
复制
list1 = List(("jira","ABC"),
             ("collApp","ABC"),
             ("amarColl","ABC"),
             ("Ubuntu1404","PQR"),
             ("relColAdmin","XYZ"))

list2 = List(("Linux_server","Hyper-V","suseLinux"), 
             ("Linux_server","VmWare","collApp"), 
             ("Linux_server","VmWare","relColAdmin"), 
             ("Linux_server","VmWare","amarColl"),
             ("Linux_server","Hyper-V","ubuntu1310"))

从上面的两个列表中,我想检查第二个列表是否包含list1的每个元素(元组)的第一个值,如果匹配,则在list2中插入第二个值,否则在list2中插入空值。

以下是示例输出-

代码语言:javascript
复制
output = List(("Linux_server","Hyper-V","suseLinux",""),
              ("Linux_server","VmWare","collApp","ABC"),
              ("Linux_server","VmWare","relColAdmin","XYZ"),
              ("Linux_server","VmWare","amarColl","ABC"),  
              ("Linux_server","Hyper-V","ubuntu1310",""))
EN

回答 3

Stack Overflow用户

发布于 2015-02-06 16:11:15

list1已经处于将其转变为地图的完美状态。我们将把它转换成一个默认值为"“的地图。因此,如果我们从map中请求一个不存在的键,我们会得到"“

代码语言:javascript
复制
scala> val map1 = list1.toMap.withDefaultValue("")
map1: scala.collection.immutable.Map[String,String] = 
    Map(amarColl -> ABC, Ubuntu1404 -> PQR, relColAdmin -> XYZ,
        jira -> ABC, collApp -> ABC)

现在我们要做的就是将3元组映射到4元组:

代码语言:javascript
复制
scala> list2.map { case (a,b,c) => (a,b,c,map1(c)) }
res0: List[(String, String, String, String)] = 
   List((Linux_server,Hyper-V,suseLinux,""),
        (Linux_server,VmWare,collApp,ABC), 
        (Linux_server,VmWare,relColAdmin,XYZ), 
        (Linux_server,VmWare,amarColl,ABC),
        (Linux_server,Hyper-V,ubuntu1310,""))
票数 5
EN

Stack Overflow用户

发布于 2015-02-06 15:59:07

如果list1的元组的第一个元素可以放在list2的元组的任意位置,请使用以下代码:

代码语言:javascript
复制
list2.map {
  case (a, b, c) =>
    (a, b, c,
      list1.find(e =>
        Seq(a, b, c).contains(e._1)
      ).map(_._2).getOrElse(""))
}

如果list1的元组的第一个元素只能放在list2的元组的第三个位置:

代码语言:javascript
复制
list2.map {
  case (a, b, c) =>
    (a, b, c,
      list1.find(_._1 == c)
        .map(_._2).getOrElse(""))
}
票数 1
EN

Stack Overflow用户

发布于 2015-02-06 16:06:39

首先,把它们拉在一起

代码语言:javascript
复制
val zipped = list1 zip list2 

然后,映射到拉链对上并构建结果

代码语言:javascript
复制
val output = zipped.map(case ((key, value), targetTuple) => buildResultTuple(key, value, targetTuple))

def buildResultTuple(key:String, value: String, t:Tuple3):Tuple4 = {
   val l = t.productIterator.toList
   if (l contains key) (t._1, t._2, t._3, value)
   else                (t._1, t._2, t._3, "")
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28360808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档