2014-02-25 18 views
1

假設我有一個字符串映射 - >整數列表。我想創建一個函數,它接受作爲參數的字符串列表並返回與該列表中所有字符串相關的所有整數。即如果地圖X包含以下映射:如何將整數列表轉換爲映射刪除重複項?

database = [("Bob",[1,2,3]),("John",[1,5,6]),("Trevor",[4,5,7])] 

如果該功能只在[「鮑勃」,「約翰」作爲名稱的列表,它應該返回,

[1,2,3,5,6] 

自從鮑勃相關到1,2,3和約翰相關1,5,6(兩個名稱的相同條目不重複)。如果我不需要,我也不想引入一個可變變量,從而導致我相信理解產生這個數值列表將是實現這一點的最佳方式,但我不知道如何。

回答

5

如果你想使用一個for-comprehension可以使這樣的:

val result = for { 
    key <- keys 
    nums <- map.get(key).toSeq 
    num <- nums 
} yield num 

result.distinct 

說明:

對列表中的每個關鍵設法得到一個條目,並將其轉換爲Seq(必要的,因爲flatMap在這種情況下期望Seq)並將列表中的每個數字添加到結果中。如果密鑰不在地圖中,集合將爲空,因此不會產生任何結果。最後致電distinct刪除重複項。

1
val myset = Set("Bob","John") 
val database = Map(("Bob"->List(1,2,3)),("John"->List(1,5,6)),("Trevor"->List(4,5,7))) 

val ids = database.filter(m => myset.contains(m._1)).map(_._2).flatten.toList.distinct 

輸出:

ids: List[Int] = List(1, 2, 3, 5, 6) 
4
val myMap = Map("Bob" -> List(1,2,3), "John" -> List(1,5,6), "Trevor" -> List(4,5,7)) 
val names = List("Bob", "John") 

可以使用方法withDefaultValue默認值添加到Map

val mapWithDefaul = myMap withDefaultValue Nil 

然後,你可以在flatMap使用Map的功能:

names.flatMap(mapWithDefaul).distinct 
// List(1, 2, 3, 5, 6) 
1

喜歡的東西:

val result = database.filter(elem => list.contains(elem._1)).foldLeft(List())((res,elem) => res ++ elem._2) 

其中列表是名稱的輸入列表。

2

val db = Map("Bob" -> List(1,2,3), "John" -> List(1,5,6), "Trevor" -> List(4,5,7)) 
val names = List("Bob", "John") 

然後類似的方法來@塞尼亞是一個使用flatMap

implicit class mapCorr[A,B](val db: Map[A,List[B]]) extends AnyVal { 
    def corr(keys: List[A]): List[B] = { 
    keys.flatMap{ k => db get k }.flatten.distinct 
    } 
} 

scala> db.corr(keys) 
res0: List[Int] = List(1, 2, 3, 5, 6) 

在這裏,我們允許從類型A類型的密鑰列表和地圖A鍵入List[B]