arrays - 按名称获取数组的总和
问题描述
我正在为我的工作制作个人应用程序。我想为我做的每一件事列出贫困者的体重,这样我就知道我一天需要什么体重了。
所以可以说我可以做 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
如果有人可以为我指出正确的方向,那就太好了。我在想将每种食物设置为一个数组,并尝试按名称添加每种成分的值。
解决方案
由于您的食物基本上是成对的(成分:计数),因此理想情况下,它将由 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]
在这里,我们通过求和计数来合并food1
和food2
组合相同成分的数量。
并合并我们可以使用的食物列表reduce(into:, _)
[food1, food2, food3]
.reduce(into: [:]) { sum, food in
sum.merge(food, uniquingKeysWith: +)
}
/// ["sugar": 7, "brownSugar": 3, "cheese": 6, "flour": 2, "eggs": 12]
在这里,我们从空总和 ( [:]
) 开始,并在其中合并所有食物。
推荐阅读
- javascript - 从输入按钮提交后防止传单地图重新加载
- selenium - 将值从 csv 传递到 jmeter 中的 selenium 驱动程序脚本
- android - com.google.zxing.qrcode.detector: -> java.lang.NoSuchMethodError: 不在棉花糖上扫描
- angular - How to push data from DB into FormArray
- spring-boot - Spring Boot 和 Socket IO Arduino 客户端
- python - 试图在 main 中调用一个函数但没有得到 2 个输出
- telegram-bot - 机器人在大约两周后不发送照片(除非我再次发送给他)
- pandas - 如何使用 pd.IntervalIndex.is_overlapping 在 DataFrame 中查找重叠区间?
- java - POST 参数为空,但存在于正文中
- flutter - 在 Flutter 测试中从文件中读取资源