这是可能的,但在一个迂回的方式。我建议你考虑使用不同的方法。
话虽这么说,这里是你会怎么做:
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