2012-07-20 18 views
1

我一直在做一些稍微複雜的地圖工作,我需要解決的最後一個問題是取代Map(),其關鍵是Option[Long],並用一個Option[User]的關鍵替換它。Scala:用對象替換地圖中的鍵?

地圖上看起來像:

(Map[ Option[Long], List[Tuple3[Job,Option[Client],Option[Project]]] ]()

我有Option[User]列表。我正在考慮一個foldleft可以做到這一點,但語法對於我的業餘愛好來說很棘手。我嘗試沒有成功如下:

theMap.foldLeft(users){ 
     (u,j) => 
     if(j._1!=None) { 
      Map(u, j._2) 
     } else { 
      Map(User.placeholder, j._2) 
     } 
    }.flatten 

編譯如下錯誤提示,我可能不會得到在正確的地方的變量。

這怎麼能正確完成?

編輯:意識到我還需要匹配第一個Long鍵到user.id。如果我弄清楚它會更新它。

越來越近,只是切換到映射。但是這有點麻煩:

allJobs.map{ 
    case ((i,l)) => 
     val user = users.map{ user => 
     if(user.map(_.id)==i) user 
     } 
     Tuple2(user.head, l) 
    } 

回答

3

如果我正確理解你,那麼這應該做到這一點。

val userMap = users map {u => (u, theMap(u map {_.id})} toMap 

我不知道Option鍵多大的幫助,在這裏,因爲只能有一個None關鍵,但如果你需要考慮的是關鍵,它可能不是在users列表,那麼你可以將其添加分別。

val newMap = if(theMap contains None) userMap + (User.placeholder, theMap(None)) 
      else userMap 
+0

這是乾淨的。我發現我的語法卡住了,我不知道那個漂亮的'toMap'。 「無」確實很重要,因爲我需要輸出沒有關聯用戶的作業。非常感謝你的幫助! – crockpotveggies 2012-07-20 18:26:49