2013-05-15 19 views
15

ich ein NSDictionary bin mit, dass selbst Wörterbücher einige Schlüssel enthält und dessen Werte.Verfahren Format ist wie,Filtering NSDictionary mit Prädikat

{ 

"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" 
    }, 
} 

Ich muss mit dem Fall filtern, die key1 sollte „tt“ und key2 sein sollte "vv" mit NSPredate verwenden.

Antwort

24

Angenommen,

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" 
    }, 
} 

Jetzt können Sie durch die folgende Weise filtern:

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

versuchen, diese zu überprüfen:

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
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); 

versuchen Sie dies wirklich hilfreich für Sie.

+0

funktioniert nur, wenn Tasten Strings sind. – akashivskyy

6

versuchen, wie diese it'l works.you können Ihre eigenen Werte hier

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); 

O/P eingestellt werden: -

(
     { 
     key1 = tt; 
     key2 = vv; 
    } 
) 

Edit: - für Clear Explation

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); 

O/P: -

(
     { 
     key1 = tt; 
     key2 = vv; 
    } 
) 
+0

@ Nassif: einmal überprüfen Sie meine bearbeitete Antwort es hilft Ihnen. – Balu

+0

Überprüfen Sie die Antwort hier: http://stackoverflow.com/questions/4901774/nspredicate-on-nsdictionary – Meet

1

Sie keysOfEntriesPassingTest Methode von NSDictionary verwenden können.

Eg.

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"]); 
}]; 

Referenz: Apple Doc