2016-01-23 42 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)哈希值查找(即,只是試圖直接訪問鍵)。