过滤一个数组以求另一个数组的和

时间:2019-09-11 17:24:16

标签: arrays swift

我有一个包含很多元素的数组,但是其中两个对我很重要。 语言 和数字

我从他们那里得到一些信息

_ = 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”

谁能告诉我该怎么做?

1 个答案:

答案 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
})