這是可能的,但在一個迂迴的方式。我建議你考慮使用不同的方法。
話雖這麼說,這裏是你會怎麼做:
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
[NSArray arrayWithObjects:@"a", @"b", @"c", nil], @"a",
[NSArray arrayWithObjects:@"b", @"c", @"a", nil], @"b",
[NSArray arrayWithObjects:@"c", @"a", @"b", nil], @"c",
[NSArray arrayWithObjects:@"a", @"b", @"c", nil], @"d",
nil];
NSPredicate *p = [NSPredicate predicateWithFormat:@"%@[SELF][0] == 'a'", d];
NSLog(@"%@", p);
NSArray *keys = [d allKeys];
NSArray *filteredKeys = [keys filteredArrayUsingPredicate:p];
NSLog(@"%@", filteredKeys);
NSDictionary *matchingDictionary = [d dictionaryWithValuesForKeys:filteredKeys];
NSLog(@"%@", matchingDictionary);
這裏是發生了什麼事情:
我們有我們的源字典,d
。這是一個字典,其中一個字母(a
,b
,c
或d
)被鍵入到一個數組中。我們將找到對應於第一個元素爲a
的數組的所有鍵。
我們的謂語是:
[NSPredicate predicateWithFormat:@"%@[SELF][0] == 'a'", d];
這裏,我們使用的索引操作上我們的源代碼字典。 SELF
,當評估該謂詞時,將是d
的密鑰中的一個。所以%@[SELF]
將返回一個數組。然後我們取該數組的第0個元素,並將其與字符串a
進行比較。如果匹配,則返回YES
。
然後,我們抓住字典中的所有鍵並使用此謂詞對它們進行過濾。這意味着結果數組將僅包含對應數組的第一個元素爲a
的鍵。
一旦我們有了匹配的關鍵字,我們就從源字典中提取一個「子字典」來獲得最終的縮減字典。
在上面的試驗中,matchingDictionary
具有兩個鍵(a
和d
),它們都鍵合到含(a, b, c)
陣列。
如果你想要一個NSArray
而不是包含匹配的數組,你應該使用-[NSDictionary objectsForKeys:notFoundMarker:]
來代替。
但是,這是一個尷尬的解決方案,我仍然認爲你應該重新組織你的數據。
大部分是正確的,除了在`for ... in`循環中使用字典時,最終會遍歷*鍵*而不是值。 – 2011-01-28 17:45:49
我喜歡這個解決方案,但沒有看到這是如何「迭代鍵」。 NSString * objectAtFirstIndex = [currentArray objectAtIndex:0]; if([objectAtFirstIndex isEqualTo:mySearchString]); objectAtFirstIndex正在獲取當前數組的值而不是密鑰。正確? – Nungster 2011-01-28 19:03:33