2013-11-15 59 views
2

我有一組鍵,比如Set[MyKey],對於每個要通過某個值函數計算值的鍵,可以說是computeValueOf(key: MyKey)。最後,我想要有一個Map哪些地圖key -> value從一組鍵中創建一個映射

什麼是最有效的方式來做到這一點,而不是迭代太多?

回答

2

實際上這是collection.breakOut,我最喜歡的離奇斯卡拉巫術的一個漂亮整潔的應用程序:

type MyKey = Int 

def computeValueOf(key: MyKey) = "value" * key 
val mySet: Set[MyKey] = Set(1, 2, 3) 

val myMap: Map[MyKey, String] = 
    mySet.map(k => k -> computeValueOf(k))(collection.breakOut) 

什麼這裏發生了一些討論見this answer。與toMap不同,這不會構建中間Set,節省您一些分配和遍歷。但它的可讀性也較差 - 我只提供它,因爲你提到你想避免「迭代太多」。

+0

這是否避免了比'setOfKeys.iterator.map(key =>(key,computeValueOf(key)).toMap'多的反覆? – scand1sk

+0

感謝您的回答,我仍然需要多瞭解一點。請儘量避免迭代,因爲我正在處理的問題有點組合,所以保存迭代和「惰性val」應該有所幫助。 – jbx

+0

@TravisBrown,請你多解釋一下'collection.breakOut'在做什麼?關鍵字'collection'來自哪裏?它沒有被聲明在任何地方,但它的工作。謝謝 – jbx

3

Tuple2 s的集合可以轉換爲Map,其中元組的第一個元素是鍵,第二個元素是值。

val setOfKeys = Set[MyKey]() 
setOfKeys.map(key => (key, computeValueOf(key)).toMap 
+0

哦,當然,我很傻。爲什麼'toMap'函數和相關的函數都期望在一個元組中存在值,這就是爲什麼我問這個問題的原因。在這種情況下仍然如此綠色:。一如既往的感謝! – jbx

+0

沒問題,直到你知道所有的功能和它們做了什麼,然後它們變成第二種自然,需要一段時間。如果你改用另一種語言,你會**真的**開始錯過他們:) –

+0

是的,我已經開始使用Java多年後使用Scala。到目前爲止,我很享受它,但仍然找不到通過顯而易見的方式(正如你可以從我今天的問題中看到的那樣),這有時會令人沮喪。 – jbx