2016-01-23 40 views
2

我知道这个问题对某些人来说似乎很明显,但我无法绕过一个合适的解决方案。检查字典嵌套数组中的每个值Swift

我有一本字典

someDict = [String : [Int]] 

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

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

我的目标是,如果someString = someDict key比较,如果是 - 比较各int值里面的嵌套数组到someNumber(检查它是否更小或更大,并提供一些输出)。

谢谢!

回答

2

首先你指望匹配你后一个字典的关键 - 通过所有的键,以便我们循环。

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

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 
    } 
} 

在操场上试试吧。

+1

请注意,如果我们正在处理一个巨大的字典,这种类型会破坏字典散列值查找的目的(当我们只能直接尝试访问密钥时,循环遍历所有字典条目)。 – dfri

+1

你绝对是对的,我更喜欢你的解决方案。更干净,更快。 –

1

试试这个:

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") 
    } 
} 
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}) 
+0

请注意,您不需要在上面的零合并部分('someDict [someString] ?? [] ...')中显式声明空数组的类型。或者,对于不存在的键('let smallerNumbers = someDict [someString] ?. filter({$ 0 dfri

+1

@dfri,是的,你是对的,编译器可以在这种情况下推断出适当的类型 – Cristik

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)哈希值查找(即,只是试图直接访问键)。