我在整理字典数据方面遇到了问题

时间:2015-12-16 05:23:40

标签: swift for-loop dictionary

这是用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

1 个答案:

答案 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