【问题标题】:Get the sum of the values of the same label from the struct从结构中获取相同标签的值的总和
【发布时间】:2019-06-13 21:20:13
【问题描述】:

我需要将此信息中未出现的添加到数组中。如果有重复,这笔钱将被汇总然后存入一个。我怎样才能做到这一点?数据可能很多。

import UIKit

struct TestData {
    let Label : String
    var Money : Double
}

var SaveDate = [TestData]()
var TestD = [TestData]()
SaveDate.append(TestData(Label: "test1", Money: 55))
SaveDate.append(TestData(Label: "test1", Money: 35))
SaveDate.append(TestData(Label: "test2" , Money: 15))
SaveDate.append(TestData(Label: "test1" , Money: 10))
SaveDate.append(TestData(Label: "test3" , Money: 30))
print([{Label "test1", Money 55}, {Label "test1", Money 35}, {Label "test2", Money 15},{Label "test1", Money 10}, {Label "test3", Money 30}])


//Result presentation
//Label1 = test1 , Money = 100
//Label2 = test2 , Money = 15
//Label3 = test3 , Money = 30

【问题讨论】:

    标签: arrays swift generics struct


    【解决方案1】:

    就这么简单。

    let dict = SaveDate.reduce(into: [String: Double]()) { (result, data) in
        result[data.Label, default: 0] += data.Money
    }
    

    或者更简洁,

    let dict = SaveDate.reduce(into: [String: Double]()) { $0[$1.Label, default: 0] += $1.Money }
    

    字典

    // ["test2": 15.0, "test3": 30.0, "test1": 100.0]


    注意:您应该使用 lowerCamelCase 作为变量名称,如 Swift API guidelines

    【讨论】:

      【解决方案2】:

      您可以使用字典来完成此操作。

      import UIKit
      
      struct TestData {
          let Label : String
          var Money : Double
      }
      
      var SaveDate = [TestData]()
      SaveDate.append(TestData(Label: "test1", Money: 55))
      SaveDate.append(TestData(Label: "test1", Money: 35))
      SaveDate.append(TestData(Label: "test2" , Money: 15))
      SaveDate.append(TestData(Label: "test1" , Money: 10))
      SaveDate.append(TestData(Label: "test3" , Money: 30))
      
      var dictionaryOfValues:[String:Double] = [:]
      
      func addUp() {
          for currentItem in SaveDate {
              dictionaryOfValues[currentItem.Label] = (dictionaryOfValues[currentItem.Label] == nil ? currentItem.Money : dictionaryOfValues[currentItem.Label] + currentItem.Money)
          }
      }
      
      addUp()
      print(dictionaryOfValues) //["test1": 100.0, "test2": 15.0, "test3": 30.0]
      

      我在 Swift Playground 中运行它。

      字典可以跟踪您何时遇到标签。我这样做的原因dictionaryOfValues[currentItem.Label] = (dictionaryOfValues[currentItem.Label] == nil ? currentItem.Money : dictionaryOfValues[currentItem.Label] + currentItem.Money) 是因为它需要 1) 将其添加到字典中或 2) 将当前值附加到字典中已有的值。

      只要您准备好了,您就可以致电addUp(),它会为您完成工作。

      【讨论】:

        【解决方案3】:

        这可能会有所帮助:

        import UIKit
        
        struct TestData {
            let label : String
            var money : Double
        }
        
        var saveData = [TestData]()
        saveData.append(TestData(label: "test1", money: 55))
        saveData.append(TestData(label: "test1", money: 35))
        saveData.append(TestData(label: "test2" , money: 15))
        saveData.append(TestData(label: "test1" , money: 10))
        saveData.append(TestData(label: "test3" , money: 30))
        
        let testData = saveData.reduce([TestData](), { currentData, newElement in
            var newDataArray = currentData // Swift doesn't allow modifying parameter
            if newDataArray.count == 0 {
                newDataArray.append(newElement)
            } else {
                if let sameLabelIndex = newDataArray.firstIndex(where: { $0.label == newElement.label }) {
                    newDataArray[sameLabelIndex].money += newElement.money
                } else {
                    newDataArray.append(newElement)
                }
            }
            return newDataArray
        })
        
        print(testData)
        

        Apple 在reduce 上的文档:https://developer.apple.com/documentation/swift/array/2298686-reduce

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-29
          • 2021-12-07
          • 2016-05-11
          • 1970-01-01
          • 2021-07-10
          • 2017-05-17
          相关资源
          最近更新 更多