2015-02-06 9 views
1

我有以下兩個列表 -如何查找列表包含從另一個列表中的任何值,並使用scala進行組合列表?

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")) 

從上面拖列表我要檢查,如果第二個列表包含列表1中的每個元素(數組)的第一個值,如果匹配在列表2插入第二個值,否則插入空值列表2。

下面是示例輸出 -

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","")) 
+1

「在列表2中插入第二個值,否則在列表2中插入空值」。注意元素不是列表,而是元組。將元素「插入」元組並不合理,因爲結果是不同的類型。在這裏需要元組有什麼原因嗎? (這裏有很多類似的問題,所以我認爲這是一門課程的任務?) – 2015-02-06 09:44:37

回答

1

如果list1的的元組的第一元件可以被放置在list2中的元組的任何位置上,使用如下代碼:

list2.map { 
    case (a, b, c) => 
    (a, b, c, 
     list1.find(e => 
     Seq(a, b, c).contains(e._1) 
    ).map(_._2).getOrElse("")) 
} 

如果list1的的元組的第一元件可被放置在list2的元組的第3位:

list2.map { 
    case (a, b, c) => 
    (a, b, c, 
     list1.find(_._1 == c) 
     .map(_._2).getOrElse("")) 
} 
+0

這是O(n^2),可能是O(n) – stew 2015-02-06 08:13:31

+0

@ stew同意你的看法。在第二種情況下使用'Map'更有效。 – 2015-02-06 08:23:11

0

首先,zip他們一起

val zipped = list1 zip list2 

之後,地圖上的壓縮和對構建結果

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, "") 
} 
5

列表1中已存在變成了一個地圖完美的形式。我們將它變成一個默認值爲「」的地圖。所以,如果我們要求從地圖的關鍵是不存在的,我們回來「」

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元組:

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,"")) 
相關問題