【问题标题】:How to combine objects in an array by condition in Swift?如何在 Swift 中按条件组合数组中的对象?
【发布时间】:2017-07-27 13:59:08
【问题描述】:

我有一个对象数组:

struct Person {
    let name: String
    let dateOfBirth: Date
    let money: Double
}

它包含人员以及他们收到或花费了多少钱。 该数组包含 54 个这样的对象。 我需要找到所有具有相同名称和日期字段的对象并将它们的钱相加。也就是说,最后,我必须在我的数组中获得少于 54 条记录。

示例: 在数组中,对象 John 有 3 条记录。例如,首先,他收到 15.0 美元,然后花费 7.0 美元,然后收到 4.0 美元。对于我的任务,我需要在数组中有 1 条记录而不是 3 条(资金为 12.0 美元)

有人知道吗?

【问题讨论】:

  • (offtopic) 我真的建议用Decimal 而不是Double 来表示货币值,否则在对值求和时会开始失去精度。
  • @Sulthan,谢谢你的建议,但这只是一个例子,我不使用它

标签: ios arrays swift sorting


【解决方案1】:

您可以遍历数组并将它们添加到字典中,其中与出生日期连接的名称将是键,而金钱的总和将是值。

假设包含Person 对象的数组称为people

var moneyDictionary = [String:Double]()
for person in people {
    let personKey = "\(person.name)\(person.dateOfBirth)"
    if let personRecord = moneyDictionary[personKey] {
        moneyDictionary[personKey] = personRecord + person.money
    } else {
        moneyDictionary[personKey] = person.money
    }
}

【讨论】:

    【解决方案2】:

    也许这样的事情会起作用:

    struct Person {
        let name: String
        let dateOfBirth: Date
        let money: Double
    }
    
    let currentDate = Date()
    let person = Person(name: "James", dateOfBirth: currentDate, money: 15)
    let person1 = Person(name: "James", dateOfBirth: currentDate, money: -7)
    let person2 = Person(name: "James", dateOfBirth: currentDate, money: 4)
    
    // array of person objects
    let personArray = [person, person1, person2]
    
    // selected person
    let selectedPerson = person
    
    // filter with selected person only
    var matchingPersons = personArray.filter {
        $0.name == selectedPerson.name && $0.dateOfBirth == selectedPerson.dateOfBirth
    }
    
    // extract values
    var values = matchingPersons.map { $0.money }
    
    // total
    var total = values.reduce(0, +)
    

    【讨论】:

    • 对了,你可以通过==来比较Date的实例。
    • 更新了我对@Sulthan 评论的回答??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    相关资源
    最近更新 更多