2016-12-27 82 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

相关问题