【问题标题】:Swift - Compare DictionariesSwift - 比较字典
【发布时间】:2015-11-23 13:14:27
【问题描述】:

我有两个字典,看起来像:

var dict1 = [Int: [String: AnyObject]]

var dict2 = [Int: [String: AnyObject]]

例如:

dict1: [0: ["sender": "user1", "time": NSDate(), "mId": "as2f2ASf"], [1: ["sender": "user1", "time": NSDate(), "mId": "Sjf82FsJ"]

dict2: [0: ["sender": "user2", "time": NSDate(), "mId": "J2fAS92D"], [1: ["sender": "user2", "time": NSDate(), "mId": "Sjf82FsJ"]

我想知道字典中是否有具有相同 mId 的数据,如果我想执行一些操作。 我为此编写了这段代码并得到了这些错误。

for (_, value) in dict1! {
  for content in value {
    if content.0 == "mId" {
      var mID = content.1
      for (_, 2ndValue) in dict2 {
        for 2ndContent in 2ndValue {
          if 2ndContent.0 == "mId" {
            var 2ndMID = 2ndContent.1
            if mID == 2ndMID {
              //Do Some Action
            }
          }
        }
      }
    }
  }
}

以下是错误: https://www.dropbox.com/s/e28ple6640hkrzo/Bildschirmfoto%202015-08-28%20um%2021.21.54.png?dl=0

【问题讨论】:

  • 有很多语法错误,我不确定像arr 这样的东西来自哪里。话虽如此,您的直接错误是因为您不能以数字开头的变量名。
  • 哦 - 通常我不会那样做,但我想,如果 var 可以是笑脸,它也可以以数字开头

标签: ios swift dictionary swift2


【解决方案1】:

首先,正如 Eric 在他的评论中所说,您会遇到错误,因为您不能以数字开头的变量名。

其次,您在这里所说的“字典”实际上是一个元组数组 - 如果您通过运行 var dict1 = [Int,[String,AnyObject]() 在 Swift REPL 中定义您的 dict1 变量,您将得到: dict1: [(Int, [String : AnyObject])] = 0 values

具有等效结构的字典将被定义为: var dict1 = [Int:[String:AnyObject]]() - 返回 dict2: [Int : [String : AnyObject]] = 0 key/value pairs 在 REPL 中。

因此,您显示的 dict1 和 dict2 声明将不起作用。它们需要声明如下以匹配您指定的类型:

var dict1 = [(0, ["sender": "user1", "time": NSDate(), "mId": "as2f2ASf"]), (1, ["sender": "user1", "time": NSDate(), "mId": "Sjf82FsJ"])]

var dict2 = [(0, ["sender": "user2", "time": NSDate(), "mId": "J2fAS92D"]), (1, ["sender": "user2", "time": NSDate(), "mId": "Sjf82FsJ"])]

如果您想使用实际的字典,请使用:

var dict3 = [[0: ["sender": "user1", "time": NSDate(), "mId": "as2f2ASf"]], [1: ["sender": "user1", "time": NSDate(), "mId": "Sjf82FsJ"]]]

虽然我可以在您发布的代码中看到您想要实现的目标,但我认为您采用的方法并不正确。任何时候您有 4 级嵌套的 for 循环,您都应该考虑是否有更好的方法来解决问题。 当您只对“mId”的值感兴趣时,您正在遍历字典中的所有键。只需查找该键的值即可摆脱 2 个循环以及对您不感兴趣的事物进行大量无意义的迭代:

for (_,value1) in dict1 {
  if let mld1 = value1["mId"] {
    for(_,value2) in dict2 {
      if let mld2 = value2["mId"] {
        if mld1 == mld2 {
          println("Found diff")
        }
      }
    }
  }
}  

if let 是确保您进行有效比较所必需的(即,如果 'mld' 的值在两个字典中都是 nil,则避免误报)。不知道这在您的数据模型中是否可能,但总是值得彻底。请注意,此解决方案使用元组数组,如您的示例中一样 - 如果您使用实际字典,则需要稍有不同。

【讨论】:

  • 哇 - 谢谢你的回答。这是非常详细和有启发性的。我通过发布我的答案犯了一个严重的错误,因为正如您所指出的,这些是元组而不是字典。我更新了我的帖子,因为它确实应该是字典。您能否也更新您的代码,使其与我的问题相匹配?谢谢!!
【解决方案2】:

我不确定我是否理解你的问题,但这是我的想法:

for (key, value) in dicOne {
  for (keyTwo, valueTwo) in dicTwo {
    for (keyItem,valueItem) in value {
        for (keyItemTwo, valueItemTwo) in valueTwo {
            if keyItem == keyItemTwo && valueItem == valueItemTwo{
                println("do some action")
            }
        }
    }
  }
}

第一个循环用于第一个字典,第二个循环用于另一个字典。在此之后,您将进入两个字典的第二层 ["a": "A"]。所以下一步就是获取这本词典。因为这是另外两个循环。

只是一个问题:你尝试过元组吗?像这样:

var dictionaryOne:[Int: (String, String)] = [1: ("a", "A")]

var dictionaryTwo:[Int: (String, String)] = [1: ("a", "A")]

for (key, value) in dictionaryOne {
    for (keyTwo, valueTwo) in dictionaryTwo {
        if value.0 == valueTwo.0 && value.1 == valueTwo.1 {
            println("nice action")
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 2017-12-09
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多