【问题标题】:I am having issues consolidating data from dictionaries我在整合字典中的数据时遇到问题
【发布时间】:2016-03-22 03:28:06
【问题描述】:

这是用 swift 编写的,但它更多的是一个逻辑问题,希望有人可以提供帮助,我一直在开发一个应用程序,该应用程序会收取费用,然后根据“欠款”中指定的用户在用户之间分配总数费用的财产。我能够通过为所有用户创建一个字典来划分总数,键是他们的名字,值是每个其他用户的更多字典,键是其他用户的名字,值是数量欠的(如果欠父字典的钱是正数,相反的数字是负数),我现在的问题是合并所有的钱,以便所有用户的欠款相互分配(例如:如果用户 1 欠用户 2 10 美元但是用户 2 欠用户 3 5 美元,那么用户 1 现在只欠用户 2 5 美元,但现在还欠用户 3 5 美元,用户 2 的债务已清偿) 我知道它似乎与字典开始混淆,但这是字典的一个示例,以及指向我的 .playground 的链接,它显示了我正在尝试的内容以及我如何设置它的想法,最后一个 for 循环是问题,也许有更好的方法?

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

【问题讨论】:

  • 你如何处理一个“欠”自己钱的人?在您的工具示例中,所有用户都欠 Josh。大卫、克雷格和迈克每个人都欠他 20 美元,而乔什欠自己 20 美元吗?还是乔希欠自己0?
  • Josh 欠自己 0,我之所以这样设置,是因为当我填充“allDic”时,我需要确保它的广泛性并涵盖所有用户
  • 您可能希望将最后一个循环添加到您的问题中。即使这些要点/游乐场链接在未来中断,这对未来的读者了解问题是有帮助的。

标签: swift for-loop dictionary


【解决方案1】:

您要建模的本质上是Directed Acyclic Graph。但是,如果您需要对关系进行的查询相对简单(即列出每个人的未偿金额),那么您可能能够摆脱一些面向对象的建模而不是完整的 DAG。构造类和与尝试使用数组和/或字典完成相同的事情相比,在这些类中嵌入逻辑将使您的代码更加更易于阅读。

一个骨架示例是:

公共类债务{ var owedBy: 人 变量数量:浮动 初始化(金额:浮动,来自:人){ self.amount = 金额 self.owedBy = 从 } } 公共类人{ 变量名称:字符串 var 贷款:[债务] = [] 初始化(名称:字符串){ self.name = 名称 } 公共函数 addLoan(债务:债务){ 贷款。追加(债务) } 公共函数 showLoans() { 打印(“\(名称):”) 贷款债务{ print("欠\(debt.amount) by \(debt.owedBy.name)") } } }

这将允许您创建贷款并使用以下代码显示存在的内容:

让比尔 = 人(姓名:“比尔”) 让托尼=人(名称:“托尼”) Bill.addLoan(债务(金额:20.0,来自:Tony)) Bill.showLoans()

Bill 调用 showLoans() 会产生:

账单: 托尼欠20.0

【讨论】:

  • 感谢您的回复!我认为我不能走那条路,因为每个“Person”对象都有一个“Trips”数组,然后每次旅行都有一个“Expenses”数组,它具有“paidBy”和“owes”属性。我可以拆分谁欠谁什么,但问题是当确保相同的 5 美元不会通过 4 个“人”手而只是让 1 人支付给第 4 个人而不是 5 美元从 Person1 到 Person2 到Person3 到 Person4 刚刚将 Person1 到 Person4
猜你喜欢
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
相关资源
最近更新 更多