使用NSPredicate过滤数组的NSDictionary

Nun*_*ter 1 iphone objective-c nsdictionary nspredicate ipad

我有一个plist,我已经定义为包含许多数组的字典.我想从字典中删除所有具有与给定字符串匹配的第一个"Item 0"(默认命名约定)的数组.

我尝试过类似于过滤NSArray的东西,但是我得到了一个正则表达式错误,控制台会在字典中显示第一个数组的内容.

另外,我是否需要将我的NSDictionary实例化为NSMutableDictionary,因为我将对其执行过滤处理?是否更好的形式是将从清单中读入的NSDictionary复制到必须的,然后对其进行处理?

Dav*_*ong 9

这是可能的,但是以迂​​回的方式.我建议您考虑使用不同的方法.

话虽这么说,这是你怎么做的:

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有两个键(ad),它们都键入一个包含的数组(a, b, c).

如果你想要一个NSArray包含匹配数组的代替,你可以使用-[NSDictionary objectsForKeys:notFoundMarker:].

但是,这是一个尴尬的解决方案,我仍然认为你应该重新组织你的数据.