2012-06-11 8 views
10

मैं निम्नलिखित है NSArray युक्त NSDictionary (ओं):NSPredicate का उपयोग एकाधिक कुंजियों (नहीं कुंजी के लिए मान) के आधार पर फ़िल्टर करने के लिए

NSArray *data = [[NSArray alloc] initWithObjects: 
       [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1], @"bill", [NSNumber numberWithInt:2], @"joe", nil], 
       [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:3], @"bill", [NSNumber numberWithInt:4], @"joe", [NSNumber numberWithInt:5], @"jenny", nil], 
       [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:6], @"joe", [NSNumber numberWithInt:1], @"jenny", nil], 
       nil]; 

मैं फ़िल्टर किए गए NSArray बनाने के लिए है कि केवल ऑब्जेक्ट हैं चाहने रहा जहां NSDictionary NSPredicate का उपयोग कर एकाधिक 'कुंजी' से मेल खाता है।

उदाहरण के लिए:

  • फ़िल्टर सारणी केवल NSDictionary वस्तुओं है कि कुंजी "बिल" और "जो" को रोकने के लिए [वांछित परिणाम: नया NSArray पहले दो NSDictionary वस्तुओं होते हैं]
  • फ़िल्टर सारणी केवल NSDictionary वस्तुओं है कि कुंजी "जो" और "जेनी" को रोकने के लिए:
[वांछित परिणाम नया NSArray पिछले दो NSDictionary वस्तुओं होते हैं]

क्या कोई इसे प्राप्त करने के लिए एनएसपीडिकेट के प्रारूप को समझा सकता है?

संपादित करें:

NSMutableArray *filteredSet = [[NSMutableArray alloc] initWithCapacity:[data count]]; 
NSString *keySearch1 = [NSString stringWithString:@"bill"]; 
NSString *keySearch2 = [NSString stringWithString:@"joe"]; 

for (NSDictionary *currentDict in data){ 
    // objectForKey will return nil if a key doesn't exists. 
    if ([currentDict objectForKey:keySearch1] && [currentDict objectForKey:keySearch2]){ 
     [filteredSet addObject:currentDict]; 
    } 
} 

NSLog(@"filteredSet: %@", filteredSet); 

मैं कल्पना कर रहा हूँ NSPredicate और अधिक सुरुचिपूर्ण, यदि कोई मौजूद होगा: मैं वांछित NSPredicate लिए एक समान परिणाम का उपयोग कर प्राप्त कर सकते हैं?

उत्तर

24

वे एक ही रास्ता मैं जानता हूँ कि "सूची में 'मान 1' और 'मान 2' की सूची में"

स्वयं की तरह दो शर्तों गठबंधन करने के लिए है। @ AllKeys शब्दकोश के सभी चाबियाँ (स्वयं में एक शब्दकोश है लौटना चाहिए आपकी सरणी)।

NSArray* billAndJoe = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%@ IN [email protected] AND %@ IN [email protected]" , @"bill",@"joe" ]]; 


NSArray* joeAndJenny = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%@ IN [email protected] AND %@ IN [email protected]" , @"joe",@"jenny" ]] 
+0

: - "(NSArray *) allKeys"

कोड यदि आप उपसर्ग @ के साथ यह नहीं लिखते तो शब्दकोश सिर्फ एक कुंजी है कि "allKeys" विधि के बजाय के लिए दिखेगा वह केवल 2 विकल्प हार्डकोडिंग के बजाय NSCompoundPredicate के '+ औरPredicateWithSubpredicates: 'का उपयोग भी कर सकता था। –

+0

धन्यवाद। मैं इसे सुबह में कोशिश करूंगा। कोड ऐसा दिख रहा है जो मैं चाहता हूं! –

+0

ठीक है .. आखिरकार इस पर वापस आ गया। कोड काम करता है, बस यह सुनिश्चित करने की आवश्यकता है कि यह एटोक-एड है: 'एनएसएआरएआरई * बिल एंड जो = [[एनएसएआरएआरए ऑलोक] initWithArray: [एनएसएआरएआरए सरणी विथअरे: [डेटा फ़िल्टर किया गया एरियाउजिंग: [एनएसपीडिकेट भविष्यवाणी करेंथफॉर्मैट: @ "% @ स्वयं @ @ सभी की और% @ इन स्वयं। @ ऑलकेस ", @" बिल ", @" जो "]]]]; –

5

चूंकि एक शब्दकोश केवल nil देता है यदि आप एक गैर-मौजूदा कुंजी के मान के लिए पूछते हैं, तो यह निर्दिष्ट करने के लिए पर्याप्त है कि मान गैर-शून्य होना चाहिए।

[NSPredicate predicateWithFormat: @"%K != nil AND %K != nil", @"bill", @"joe"] 

दूसरे मामले, "जो" और "जेनी" के साथ निश्चित रूप से, एक समान पैटर्न इस प्रकार है: निम्नलिखित की तरह एक प्रारूप अपने पहले मामले को कवर करना चाहिए।

संबंधित मुद्दे

 संबंधित मुद्दे