使用谓词过滤 NSDictionary

Posted

技术标签:

【中文标题】使用谓词过滤 NSDictionary【英文标题】:Filtering NSDictionary with predicate 【发布时间】:2013-05-15 04:31:46 【问题描述】:

我正在使用一个 NSDictionary,它本身包含字典一些键及其值。格式类似于,



"1" = 
        "key1" = "ss",
          "key2" = "rr",
          "name" = "nm"
     ,
"2" = 
           "key1" = "tt",
          "key2" = "vv",
           "name" = "gf"
     ,
"3" = 
           "key1" = "nm",
          "key2" = "vv",
           "name" = "gf"
     ,
"4" = 
           "key1" = "tt",
          "key2" = "vv",
          "name" = "gf"
     ,

我需要使用 NSPredicate 过滤 key1 应该是“tt”而 key2 应该是“vv”的情况。

【问题讨论】:

【参考方案1】:

假设

mainDict = 

"1" = 
        "key1" = "ss",
          "key2" = "rr",
          "name" = "nm"
     ,
"2" = 
           "key1" = "tt",
          "key2" = "vv",
           "name" = "gf"
     ,
"3" = 
           "key1" = "nm",
          "key2" = "vv",
           "name" = "gf"
     ,
"4" = 
           "key1" = "tt",
          "key2" = "vv",
          "name" = "gf"
     ,

现在您可以通过以下方式进行过滤:

NSArray *resultArray = [[mainDict allValues] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(key1 == %@) AND (key2==%@)", @"tt",@"vv"]];

试试这个来检查:

NSMutableDictionary *mainDict=[[NSMutableDictionary alloc] init];
for(int i=1; i<=3; i++)

    [mainDict setObject:[NSDictionary dictionaryWithObjectsAndKeys:@"tt",@"key1",@"vv",@"key2",@"ttqwdwd",@"name", nil] forKey:[NSString stringWithFormat:@"%i",i]];

[mainDict setObject:[NSDictionary dictionaryWithObjectsAndKeys:@"tt",@"key1",@"kk",@"key2",@"ttwwdwd",@"name", nil] forKey:[NSString stringWithFormat:@"%i",4]];
[mainDict setObject:[NSDictionary dictionaryWithObjectsAndKeys:@"tt",@"key1",@"kk",@"key2",@"ttwwdwd",@"name", nil] forKey:[NSString stringWithFormat:@"%i",5]];
NSArray *resultArray = [[mainDict allValues] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(key1 == %@) AND (key2==%@)", @"tt",@"vv"]];
NSLog(@"%@",resultArray);

【讨论】:

【参考方案2】:

这行得通。您可以在此处设置自己的值。

NSArray *data = [NSArray arrayWithObjects:[NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"ss",@"how", nil] forKeys:[NSArray arrayWithObjects:@"key1",@"key1", nil]],[NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"tt",@"vv", nil] forKeys:[NSArray arrayWithObjects:@"key1",@"key2", nil]],[NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"vv",@"tt", nil] forKeys:[NSArray arrayWithObjects:@"key1",@"key2", nil]],nil];    
NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(key1 == %@) AND (key2==%@)", @"tt",@"vv"]];
NSLog(@"%@",filtered);

输出:

(
    
        key1 = tt;
        key2 = vv;
    
)

为了更清楚的解释:

NSMutableDictionary *dict4=[[NSMutableDictionary alloc]init];
[dict4 setObject:@"ss" forKey:@"key1"];
[dict4 setObject:@"how" forKey:@"key2"];
NSMutableDictionary *dict5=[[NSMutableDictionary alloc]init];
[dict5 setObject:@"tt" forKey:@"key1"];
[dict5 setObject:@"vv" forKey:@"key2"];
NSMutableDictionary *dict6=[[NSMutableDictionary alloc]init];
[dict6 setObject:@"vv" forKey:@"key1"];
[dict6 setObject:@"tt" forKey:@"key2"];

NSMutableArray  *data = [[NSMutableArray alloc]init];  
[data addObject:dict4];
[data addObject:dict5];
[data addObject:dict6];

NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(key1 == %@) AND (key2==%@)", @"tt",@"vv"]];
NSLog(@"%@",filtered);

输出:

(
    
        key1 = tt;
        key2 = vv;
    
)

【讨论】:

在这里查看答案:***.com/questions/4901774/nspredicate-on-nsdictionary【参考方案3】:
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);

试试这个对你真的很有帮助。

【讨论】:

【参考方案4】:

你可以使用NSDictionarykeysOfEntriesPassingTest方法。

例如。

NSSet *keys = [dict keysOfEntriesPassingTest:^BOOL(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) 
NSDictionary *object =(obj); 
return ([@"tt" isEqualToString:object[@"key1] &&[@"vv"isEqualToString:object[@"key2"]);
];

参考:Apple Doc

【讨论】:

以上是关于使用谓词过滤 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章

使用 Dask 进行 Parquet 谓词下推过滤

使用谓词过滤 NSDictionary

SwiftUI 中的动态过滤器(谓词)

Xcode:使用复杂谓词过滤核心数据集

使用谓词过滤后,我在 tableview 中的 cellForRowAtIndexPath 出现错误

在数组控制器上使用谓词过滤相关对象