2012-09-18 72 views
4

我有一個地圖[字符串,序列[字符串],並希望基本上它隱蔽的地圖[字符串,字符串]因爲我知道序列只有一個值。如何轉換地圖[字符串,序列[字符串]以地圖[字符串,字符串]

+0

的操作稱爲「地圖」(不要與地圖ADT混淆)。什麼試過了? – 2012-09-18 17:35:12

+0

看起來像有人問了一個非常類似的問題早在1月:http://stackoverflow.com/questions/8914954/how-to-convert-a-string-to-a-seqstring-in-a-map – dhg

+0

@dhg公頃那是我! – chiappone

回答

4

別人已經提到mapValues,但如果我是你,我會做這樣的:

scala> val m = Map(1 -> Seq(1), 2 -> Seq(2)) 
m: scala.collection.immutable.Map[Int,Seq[Int]] = Map(1 -> List(1), 2 -> List(2)) 

scala> m.map { case (k,Seq(v)) => (k,v) } 
res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2) 

兩個原因:

  1. mapValues方法產生視圖的結果Map,這意味着函數將每次重新計算 y ou訪問一個元素。除非您計劃一次只訪問每個元素,或者您只打算訪問其中一小部分元素,否則不希望重新計算髮生。

  2. 使用的情況下,與(k,Seq(v))確保如果函數曾經看到一個不包含正好一個元素序列的異常將被拋出。如果有零個元素,則使用_(0)_.head將拋出異常,但如果您有多個元素,則不會投訴,這可能會在事情丟失而沒有錯誤時稍後導致神祕錯誤。

0

我想我通過以下操作得到它:

mymap.flatMap(x => Map(x._1 -> x._2.head)) 
+0

這是一個開始。考慮將*置於帖子本身。但是,使用普通的「地圖」(或其他專用功能)可以更簡單,更高效地完成。 – 2012-09-18 17:36:52

3

您可以使用mapValues()

scala> Map("a" -> Seq("aaa"), "b" -> Seq("bbb")) 
res0: scala.collection.immutable.Map[java.lang.String,Seq[java.lang.String]] = M 
ap(a -> List(aaa), b -> List(bbb)) 

scala> res0.mapValues(_(0)) 
res1: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(a 
-> aaa, b -> bbb) 
+1

編寫'.head'而不是'(0)'' –

0

另一項建議:

m mapValues { _.mkString } 

這一個不可知的序列是否具有多個元素 - 它會正好連接所有串在一起。如果你關心的每個值的重新計算,你可以做到這一點的前期:

(m mapValues { _.mkString }).view.force 
相關問題