首页 > 解决方案 > 按名称获取数组的总和

问题描述

我正在为我的工作制作个人应用程序。我想为我做的每一件事列出贫困者的体重,这样我就知道我一天需要什么体重了。

所以可以说我可以做 3 种不同的东西

food 1 = sugar: 2, eggs: 4, cheese: 3
food 2 = sugar: 5, eggs: 4, brownSugar: 3
food 3 = flour: 2, eggs: 4, cheese: 3

所以假设今天要制作 2 批食品 1、3 批食品 2 和 1 批食品 3。

它会输出

Sugar: 19
Eggs: 24
Cheese: 9
brownSugar: 9
Flour: 2

如果有人可以为我指出正确的方向,那就太好了。我在想将每种食物设置为一个数组,并尝试按名称添加每种成分的值。

标签: arraysswiftsum

解决方案


由于您的食物基本上是成对的(成分:计数),因此理想情况下,它将由 Dictionary 表示,其中 key 是您的成分(现在使用String,以后可以是 any Hashable):

let food1 = ["sugar": 2, "eggs": 4, "cheese": 3]
let food2 = ["sugar": 5, "eggs": 4, "brownSugar": 3]
let food3 = ["flour": 2, "eggs": 4, "cheese": 3]

这使我们可以通过使用轻松地组合它们Dictionary.merging(_, uniquingKeysWith:)

food1.merging(food2, uniquingKeysWith: +)
/// ["sugar": 7, "brownSugar": 3, "cheese": 3, "eggs": 8]

在这里,我们通过求和计数来合并food1food2组合相同成分的数量。

并合并我们可以使用的食物列表reduce(into:, _)

[food1, food2, food3]
    .reduce(into: [:]) { sum, food in
        sum.merge(food, uniquingKeysWith: +)
    }
/// ["sugar": 7, "brownSugar": 3, "cheese": 6, "flour": 2, "eggs": 12]

在这里,我们从空总和 ( [:]) 开始,并在其中合并所有食物。


推荐阅读