这是用 swift 写的,但它更多的是一个逻辑问题,希望有人能帮忙解决,我一直在开发一个应用程序,它会收取费用,然后根据“欠款”中指定的用户在用户之间分配总计费用的属性(property)。我能够通过为所有用户创建一个字典来分配总数,其中键是他们的名字,值是每个其他用户的更多字典,键是其他用户的名字,值是数量欠款(如果欠父字典的钱是正数,相反是负数),我现在的问题是合并所有的钱,以便所有用户的欠款额相互分配(例如:如果用户 1 欠用户 2 10 美元但是 User2 欠 User3 $5 然后 User1 现在只欠 User2 $5 但现在还欠 User3 $5 并且 User2 的债务被清除) 我知道它似乎与 dictionary-inception 混淆,但这里有一个字典示例,以及指向我的 .playground 的链接,它显示了我正在尝试做什么以及如何设置它的想法,最后一个 for 循环是问题,也许有更好的方法?
User1[
User2: -20
User3: 10
User4: -5
]
User2[
User1: 20
User3: -15
User4: 0
]
要点链接: https://gist.github.com/wilks7/0c5e3ab4f5d95c945579
Playground 文件: https://www.dropbox.com/s/6h2iuic84un2uh3/expenseSplit.playground.zip?dl=0
最佳答案
您要建模的本质上是一个 Directed Acyclic Graph .但是,如果您需要对关系进行的查询相对简单(即列出每个人的未付金额),那么您可以使用一些面向对象的建模而不是完整的 DAG。构造类和与尝试使用数组和/或字典完成相同的事情相比,在这些类中嵌入逻辑将使您的代码更更易于阅读。
一个骨架示例是:
public class Debt { var owedBy: Person var amount: Float init(amount: Float, from: Person) { self.amount = amount self.owedBy = from } } public class Person { var name: String var loans: [Debt] = [] init(name: String) { self.name = name } public func addLoan(debt: Debt) { loans.append(debt) } public func showLoans() { print("\(name):") for debt in loans { print("Owed \(debt.amount) by \(debt.owedBy.name)") } } }
这将允许您创建贷款并使用如下代码显示存在的内容:
let Bill = Person(name: "Bill") let Tony = Person(name: "Tony") Bill.addLoan(Debt(amount: 20.0, from: Tony)) Bill.showLoans()
如上所示为 Bill 调用 showLoans() 会产生:
Bill: Owed 20.0 by Tony
关于swift - 我在整合字典中的数据时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34304486/