这是用swift编写的,但它更多的是一个逻辑问题,希望有人可以提供帮助,我一直在开发一个占用费用的应用程序,然后根据用户在&中指定的用户分割总数#34; owees"费用的财产。我能够通过为所有用户创建一个字典来分配总数,其中密钥是他们的名字,而值是每个其他用户的更多字典,其中密钥是其他用户'名称和值是欠款(如果钱是欠父母字典的正数,相反的负数),我的问题是现在合并所有的钱,以便所有用户欠款的金额相互分配(例如:如果User1欠User2 $ 10但User2欠User3 $ 5那么User1现在只欠User2 $ 5但现在欠User3 $ 5并且User2&#39的债务被清除) 我知道它似乎与字典开头混淆,但这里是字典的一个例子,以及我的.playground的链接,它显示我想要的想法以及我如何设置它,最后一个循环是问题,也许是更好的方式?
User1[
User2: -20
User3: 10
User4: -5
]
User2[
User1: 20
User3: -15
User4: 0
]
主旨链接: https://gist.github.com/wilks7/0c5e3ab4f5d95c945579
游乐场文件: https://www.dropbox.com/s/6h2iuic84un2uh3/expenseSplit.playground.zip?dl=0
答案 0 :(得分: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