2016-12-27 81 views
0

參照:夫特標準庫>詞典>map(_:)有沒有辦法在Swift中同時映射字典鍵/值?

返回包含在序列中的元素給定的閉合 映射的結果的陣列

如上所述,我們可以在字典做映射,但輸出將是陣列,而不是一個「映射」字典。

老實說,我不是很肯定,如果說「映射整個辭典」是合法的,但我的意思是這樣的:

認爲我們有:

let myDict = ["1": "one","2": "tow","3": "three"] 

,我們希望映射整個事情! (鍵和值)。輸出應該是:

let mappedDict = ["03": "THREE", "02": "TOW", "01": "ONE"] 

讓我們假設映射的目標是要加「0」作爲第一個字符的所有按鍵,讓所有的值是大寫的。

爲了使它更具可讀性,我發佈了一個解決方案(我試過的)作爲答案,而不是在它自己的問題中提及它;我認爲我的回答並不是如此優雅(或至少我對它的代碼味道感覺如何),我映射了鍵值,並將它們組合在字典中,每一步都是獨立完成的。

所以,我所問的是:

有沒有辦法直接一步做這個工作?類似的東西來:

這個片段是要問什麼我的演示,代碼將不能提前做工精細

let myDict = ["1": "one","2": "tow","3": "three"] 
let mappedDict = myDict.map { key, value in 
    "0" + key 
    value.uppercased() 
} 

感謝。

回答

0

您可以通過以下步驟實現:

let myDict = ["1": "one","2": "tow","3": "three"] 

let mappedKeys = myDict.map { "0" + $0.key } // ["02", "01", "03"] 
let mappedValues = myDict.map { $0.value.uppercased() } // ["TOW", "ONE", "THREE"] 

var mappedDict = [String: String]() 

let zippedArray = Array((zip(mappedKeys, mappedValues))) 

for element in zippedArray { 
    mappedDict[element.0] = element.1 
} 

print(mappedDict) // ["03": "THREE", "02": "TOW", "01": "ONE"] 

更清晰,上面的代碼片斷執行以下操作:

  • 映射的字典鍵。
  • 映射字典值。
  • 創建一個新的空字典mappedDict追加到它。
  • 將映射的鍵/值組合成zippedArray(使用zip)。
  • 填充mappedDict通過for-loop
+0

爲什麼不改變鍵值直接將值添加到'mappedDict'中就可以了,所以你可以跳過創建'mappedKeys','mappedValues'和'zippedArray'。 – Eendje

+3

沒有必要將壓縮的序列轉換爲'Array',你可以直接迭代它們。爲什麼不直接迭代字典並將變換應用於循環中的鍵和值? (例如'for(key,value)in myDict {mappedDict [「0」+ key] = value.uppercased()}')? – Hamish

+0

@Eendje我把它們分開只是爲了讓它更具可讀性......順便說一句,你認爲整個答案是一個很好的解決方案嗎? –

0

這個怎麼樣?

let myDict = ["1": "one","2": "tow","3": "three"] 
let mappedDict = myDict.reduce([:]) { (result, pair) -> [String: String] in 
    var result = result 
    result["0" + pair.key] = pair.value.uppercased() 
    return result 
} 
+2

請注意,reduce將爲每次迭代創建一箇中間字典,使其以二次而不是線性時間運行。在這種情況下,一個簡單的'for'循環更清晰,更短,*將以線性時間運行。 – Hamish

+0

@Hamish作爲一個表演,你能否以簡單的方式描述它有什麼不同? –

+1

@AhmadF區別在於'for'循環[比如我在其他評論中建議的](http://stackoverflow.com/questions/41342582/is-there-approach-to-map-dictionary-keys-values-同步快速#comment69887453_41342591)能夠直接對結果字典進行變異(由於COW優化,其中只有一個對緩衝區的引用)。另一方面'reduce'會在每次迭代時複製結果字典,這意味着結果字典將在每次減少迭代時被迭代,因此運行速度比for循環慢。 – Hamish

相關問題