我有一个包含很多元素的数组,但是其中两个对我很重要。 语言 和数字
我从他们那里得到一些信息
_ = cities[0].language
\\give me a string languages(it could be any languages and maybe it's nil, but all the language are written in same way (for example it's always English, not english)
和
_ = cities[0].number
\\give me an Int
例如,它给了我类似的东西
“英语”“ 124324”
“法语”“ 5634”
“英语”“ 753”
“德语”“ 8643”
“德语”“ 532”
无“ 6532”
我想创建一个新的数组(我们叫languageInfo
),该数组是通过过滤cities
数组而创建的。
我需要将所有相同的语言加上它们的数字之和,例如输出应该是这样的
例如,它给了我类似的东西
“英语”“ 125077”
“德语”“ 9175”
“法语”“ 5634”
“无”“ 6532”
谁能告诉我该怎么做?
答案 0 :(得分:0)
使用reduce对数字求和并转换为字典
评论reduce
中指出的内容可以用更简洁的形式写出
let dict = cities.reduce(into: [:]) { $0[$1.language ?? "", default: 0] += $1.number }
原始版本
let dict = cities.reduce(into: [String: Int](), { result, city in
var value = city.number
let key = city.language ?? ""
if let sum = result[key] {
value += sum
}
result[key] = value
})
请注意,如果语言为nil,我会使用一个空字符串作为键,另一种选择是忽略这些元素
let dict2 = cities.reduce(into: [String: Int](), { result, city in
var value = city.number
if let key = city.language {
if let sum = result[key] {
value += sum
}
result[key] = value
}
})
或注释中指出的允许nil
作为键
let dict = cities.reduce(into: [String?: Int](), { result, city in
var value = city.number
let key = city.language
if let sum = result[key] {
value += sum
}
result[key] = value
})