2011-01-31 54 views
19

如何將一個Set(「a」,「b」,「c」)轉換爲Map(「a」 - > 1,「b」 - > 2,「c」 - > 3)? 我認爲它應該與toMap一起工作。斯卡拉轉換器設置爲地圖

+2

你希望B映射到2,因爲這是集合中的第二個?或者因爲它是字母表中的第二個字母?正如其他海報所指出的那樣,套件並沒有訂購,所以第一套將無法使用。 – 2011-01-31 14:54:46

回答

30

zipWithIndex可能是你在找什麼。它將收集您的信件並創建一個新的Tuples集合,將價值與集合中的位置相匹配。你雖然有一個額外的要求 - 它看起來像你的倉位從1開始,而不是0,所以你需要改變這些元組:

Set("a","b","c") 
    .zipWithIndex //(a,0), (b,1), (c,2) 
    .map{case(v,i) => (v, i+1)} //increment each of those indexes 
    .toMap //toMap does work for a collection of Tuples 

一個額外的考慮 - 設置不保留位置。考慮使用像List這樣的結構,如果你想讓上述位置一致地工作。

+0

這就是我想要的。謝謝。 – 2011-01-31 14:26:03

7

toMap只有在Set實體是鍵/值對(例如Set((「a」,1),(「b」,2),(「c」,3))))時纔有效。 爲了得到你想要的東西,用zipWithIndex:

scala> Set("a","b","c") zipWithIndex 
    res5: scala.collection.immutable.Set[(java.lang.String, Int)] = Set((a,0), (b,1), (c,2)) 

編輯: 或(在你原來的問題:))

scala> Set("a","b","c") zip (1 to 3) toMap 

EDIT2:咄,我忘了toMap底!

19

下面是與您的Set被拉鍊使用從1開始的所有自然數的Stream另一種解決方案:

scala> Set("a", "b", "c") zip Stream.from(1) toMap 
Map((a,1), (b,2), (c,3)) 
+0

+1,這裏是最好的答案。 – missingfaktor 2012-02-04 09:01:44

2

這也將工作:

(('a' to 'c') zip (1 to 3)).toMap