按名称获取数组的总和

时间:2019-03-17 03:02:17

标签: arrays swift sum

我正在为我的工作制作个人应用程序。我想列出我所做的每件事的贫民窟,所以我知道我一天的体重需要什么。

所以可以说我可以做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

如果有人能为我指出正确的方向,那将是很棒的..我正在考虑将每种食物设置为数组,并尝试按名称将其添加到每种成分值中。

3 个答案:

答案 0 :(得分:0)

喜欢的种类:

var foodArray: [Foods] = []
// append all your foods in it when needed

func calculateAmount(foodChoices : [Foods]) -> (Sugar:Int, Eggs: Int, Cheese: Int) {

    var cheese = 0
    var sugar = 0
    var eggs = 0

    for g in foodChoices {
        if g.name == foodArray.name {
            cheese =+ g.cheese
            sugar =+ g.sugar
            eggs =+ g.eggs
        }
    }  
    return (Sugar, Eggs, Cheese)
}

您需要为食物创建一个结构,然后才能使用它。可能有更好的方法,但这是我能想到的最快的方法

答案 1 :(得分:0)

由于您的食物基本上是成对的(成分:计数),因此理想情况下将由Dictionary表示,其中关键是您的食材(现在使用String,以后可以使用任何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]

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

答案 2 :(得分:0)

function orderFood(food1count,food2count,food3count){
    var sugarCount = food1count*2+food2count*5;
    var eggCount = (food1count+food2count+food3count)*4;
    var flourCount = food3count*2;
    var cheeseCount = (food1count+food2count)*3;
    var brownSugarCount = food2count*3;
    console.log('sugar :'+sugarCount);
    console.log('egg :'+eggCount);
    console.log('flour :'+flourCount);
    console.log('cheese :'+cheeseCount);
}

orderFood(2,3,1);