Nun*_*ter 1 iphone objective-c nsdictionary nspredicate ipad
我有一个plist,我已经定义为包含许多数组的字典.我想从字典中删除所有具有与给定字符串匹配的第一个"Item 0"(默认命名约定)的数组.
我尝试过类似于过滤NSArray的东西,但是我得到了一个正则表达式错误,控制台会在字典中显示第一个数组的内容.
另外,我是否需要将我的NSDictionary实例化为NSMutableDictionary,因为我将对其执行过滤处理?是否更好的形式是将从清单中读入的NSDictionary复制到必须的,然后对其进行处理?
这是可能的,但是以迂回的方式.我建议您考虑使用不同的方法.
话虽这么说,这是你怎么做的:
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);
Run Code Online (Sandbox Code Playgroud)
这是发生了什么:
我们有源码词典d.这是一个字母(a词典a,b,c,或d)用键固定到一个数组.我们将找到与第一个元素所在的数组相对应的所有键a.
我们的谓词是:
[NSPredicate predicateWithFormat:@"%@[SELF][0] == 'a'", d];
Run Code Online (Sandbox Code Playgroud)
这里我们在源字典中使用索引运算符. SELF,当该谓词进行求值,将是一个键的d.所以%@[SELF]会返回一个数组.然后我们取该数组的第0个元素并将其与字符串进行比较a.如果匹配,则返回YES.
然后我们获取字典中的所有键并使用此谓词过滤它们.这意味着生成的数组将仅包含相应数组的第一个元素所在的键a.
一旦我们有匹配的键,我们从源字典中提取一个"子字典",以获得我们最终的简化字典.
在上面的测试中,matchingDictionary有两个键(a和d),它们都键入一个包含的数组(a, b, c).
如果你想要一个NSArray包含匹配数组的代替,你可以使用-[NSDictionary objectsForKeys:notFoundMarker:].
但是,这是一个尴尬的解决方案,我仍然认为你应该重新组织你的数据.
| 归档时间: |
|
| 查看次数: |
6874 次 |
| 最近记录: |