这是用swift写的,但这更像是一个逻辑问题,希望有人能帮上忙,我一直在开发一个应用程序,该应用程序会收取费用,然后根据费用的“owes”属性中指定的用户在用户之间分配总数。我通过为所有用户创建一个字典,其中键是他们的名字,值是其他每个用户的更多字典,键是其他用户的名字,值是所欠的金额(如果钱是欠父字典的,则为postive number,相反的负数),我的问题是合并所有的钱,以便所有用户所欠的金额在彼此之间分配(例如:如果用户1欠用户2$10,但用户2欠用户3$5,那么用户1现在只欠用户2$5,但现在还欠用户3$5,并且用户2的债务被清除)
我知道它似乎和字典的初始阶段混淆了,但是这里有一个字典的例子,和一个链接到我的。在这里它展示了我正在尝试什么和我如何设置它的想法,最后一个循环是问题,也许有更好的方法?
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
最佳答案
你试图建立的模型本质上是一个Directed Acyclic Graph。但是,如果您需要对关系进行的查询相对简单(即列出每个人的未付金额),那么您可能可以使用一些面向对象的建模而不是完整的DAG。与试图用数组和/或字典完成相同的任务相比,在这些类中构造类和嵌入逻辑将使代码更易于阅读。
一个基本的例子是:
公共债务{
Var owedby:个人
变动金额:浮动
init(金额:float,发件人:person){
self.amount=金额
self.owedby=来自
}
}
公共类人员{
变量名:字符串
VaR贷款:[债务]=[]
初始化(名称:字符串){
self.name=姓名
}
公共函数addloan(债务:债务){
贷款附加(债务)
}
public func showloans(){
打印(“\(名称):”)
贷款债务{
打印(“欠债者”(debt.owed by.name)的欠债者”(debt.amount)
}
}
}
这将允许您创建贷款,并显示代码中存在什么样的代码:
Let Bill=人(姓名:“Bill”)
Let Tony=人(姓名:“Tony”)
账单附加贷款(债务(金额:20.0,发件人:Tony))
比尔.秀洛斯()
如上所述为bill调用showloans()将产生:
账单:
托尼欠了20.0英镑
关于swift - 我在合并字典中的数据时遇到问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34304486/