【问题标题】:Check each value inside a nested array of a dictionary Swift检查字典 Swift 的嵌套数组中的每个值
【发布时间】:2016-04-29 23:45:25
【问题描述】:

我知道这个问题对某些人来说似乎很明显,但我无法找到合适的解决方案。

我有一本字典

someDict = [String : [Int]]

我还有一个整数变量和一个字符串

var someNumber = Int()
var someString = String()

我的目标是比较 someString = someDict key 是否是,如果是 - 将其嵌套数组中的每个 Int 值与 someNumber 进行比较(检查它是更小还是更大并给出一些输出)。

谢谢!

【问题讨论】:

    标签: arrays string swift dictionary


    【解决方案1】:

    您可以简单地向字典询问您感兴趣的键,并在相应的对象中枚举:

    // this helps us get rid of having to unwrap someDict["someString"] first 
    for intVal in someDict["someString"] ?? [Int]() {
        print(intVal < someNumber ? "smaller" : "not smaller")
    }
    

    或者,如果您有兴趣找到小于someNumber 的数字,您可以使用过滤支持:

    let smallerNumbers = (someDict[someString] ?? [Int]()).filter({$0 < someNumber})
    

    【讨论】:

    • 请注意,您无需在上面的 nil 合并部分中明确说明空数组的类型(someDict[someString] ?? [] ... 也可以正常工作)。或者使用可选链接 nil 返回不存在的键 (let smallerNumbers = someDict[someString]?.filter({$0 &lt; someNumber}))。
    • @dfri,是的,你是对的,在这种情况下编译器可以推断出合适的类型
    【解决方案2】:

    您可以使用可选链接,而无需显式遍历字典条目。

    var someDict = [String : [Int]]()
    someDict["SomeString"] = [Int](1...5)
    
    let someString = "SomeString"
    let someNumber = 2
    
    if someDict[someString]?.contains(someNumber) ?? false {
        print("Dict value array for key '\(someString)' contains value \(someNumber).")
    }
    else {
        print("Dict value array for key '\(someString)' does not contain value \(someNumber).")
    }
    /* Prints: Dict value array for key 'SomeString' contains value 2. */
    

    如果我们正在处理一个巨大的字典,循环遍历所有字典条目有点违背字典 O(1) 哈希值查找的目的(即,只是尝试直接访问键)。

    【讨论】:

      【解决方案3】:

      试试这个:

      var someDict = [String : [Int]]()
      
      someDict["a"] = [1, 2, 3]
      someDict["b"] = [4, 5, 6]
      
      var str = "a"
      var number = 3
      
      for (key, value) in someDict {
          if key == str {
              for num in value {
                  if num == number {
                      print("matched")
                  } else {
                      print("Oops")
                  }
              }
          } else {
              print("nope")
          }
      }
      

      【讨论】:

        【解决方案4】:

        首先,您在字典中查找与您所追求的匹配的键 - 因此我们遍历所有键。

        然后,一旦我们找到匹配项,我们就会遍历该键值的所有内容。在这种情况下,它是我们的数字数组。

        let someDict = ["matchingString" : [6,7,5,4]]
        
        var someNumber = 5
        var someString = "matchingString"
        
        for (someDictKey, numbers) in someDict {
            if someDictKey == someString {
                // Key Found
                for number in numbers {
                    if number == someNumber {
                        // Number Found
                    } else {
                        // no matching number found
                    }
                }
            } else {
                // No matching key found
            }
        }
        

        在游乐场尝试一下。

        【讨论】:

        • 请注意,如果我们正在处理一个巨大的字典,这会违背字典哈希值查找的目的(当我们可以尝试直接访问键时循环遍历所有字典条目)。
        • 您说的完全正确,而且我实际上更喜欢您的解决方案。更清洁、更快捷。
        猜你喜欢
        • 2013-09-05
        • 1970-01-01
        • 1970-01-01
        • 2016-11-14
        • 2015-10-03
        • 2015-11-17
        • 2015-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多