2015-12-06 25 views
1

我是Scala編程的新手,正在尋找一種方法來從地圖中檢索另一張地圖中過濾的一組鍵值的列表。從地圖中檢索過濾後的一組鍵值

EX- 濾波器= [K1,K2,K3] 的InputMap = [K1-> 1,K1-> 2,k2-> 6,k2-> 7,k2-> 9,k3-> 5, k10-> 66,k4-> 45]

outputMap = [K1 - >(1,2),K2 - >(6,7,9),K3 - >(5)]

感謝提前! -Nancy

+1

如果我有正確理解你的問題,關鍵s在地圖中是獨一無二的 - 這意味着你不會在地圖中多次使用同一個鍵 - 你確定這是你想要的嗎? – Hamish

+0

也許你想讓你的inputMap看起來像這樣? 'Map(「k1」 - >(1,2),「k2」 - >(6,7,9),「k3」 - > 5,「k10」 - > 66,「k4」 - > 45)' – Hamish

回答

2

您的'inputMap'示例看起來更像是鍵值對列表,因爲map不能包含重複鍵。 所以:

val list = List("k1"->1, "k1"->2, "k2"->6, "k2"->7, "k2"->9, "k3"->5, "k10"->66, "k4"->45) 
val f = Set("k1", "k2", "k3") //filter 

首先過濾器只需要按鍵:

scala>val filtered = list.filter {case (k,v)=>f(k)} 
filtered: List[(String, Int)] = List((k1,1), (k1,2), (k2,6), (k2,7), (k2,9), (k3,5)) 

下一個分組的關鍵:

scala>val grouped = filtered.groupBy(_._1) 
grouped: scala.collection.immutable.Map[String,List[(String, Int)]] = Map(k2 -> List((k2,6), (k2,7), (k2,9)), k1 -> List((k1,1), (k1,2)), k3 -> List((k3,5))) 

現在轉換成所需的格式:

val outputMap = grouped.map {case (k,v)=>k->v.map{case (ki,vi) => vi}} 
outputMap: scala.collection.immutable.Map[String,List[Int]] = Map(k2 -> List(6, 7, 9), k1 -> List(1, 2), k3 -> List(5)) 
+0

謝謝Nyavro。我正在努力做你的建議。但是,當我嘗試過濾時,出現錯誤。 val filtered = nodeFollowersList.filter {case(k,v)=> filteredNodesSet(k)}錯誤:「構造函數不能實例化爲預期類型; 找到[INFO]:(T1,T2) [INFO] required:org。 apache.spark.rdd.RDD [數組[String]]「 – Nancy

+0

什麼是錯誤信息? – Nyavro

+0

nodeFollowersList是元組的列表和filteredNodesSet是一組節點 – Nancy