2012-04-04 18 views
5

तो, मूल रूप से मेरे पास NSArray है।फ़िल्टरिंग एनएसएआरएआरई स्ट्रिंग तत्व

मैं उन फ़िल्टर किए जाने के बाद प्रारंभिक सरणी की सामग्री के साथ एक सरणी प्राप्त करना चाहता हूं। किसी दिए गए उपसर्ग से शुरू नहीं हो रहा है।

ऐसा लगता है कि filteredArrayUsingPredicate: का उपयोग करना सबसे अच्छा तरीका है; लेकिन मुझे लगता है मैं इसे कैसे कर सकता है पर यकीन नहीं है ...

यह (वास्तव में एक NSArray वर्ग में) अब तक मेरी कोड है:

- (NSArray*)filteredByPrefix:(NSString *)pref 
{ 
    NSMutableArray* newArray = [[NSMutableArray alloc] initWithObjects: nil]; 

    for (NSString* s in self) 
    { 
     if ([s hasPrefix:pref]) [newArray addObject:s]; 
    } 

    return newArray; 
} 

यह सबसे कोको के अनुकूल दृष्टिकोण है? मैं जो चाहता हूं वह जितना तेज़ हो सके ...

उत्तर

16

यहाँ filteredArrayUsingPredicate: का उपयोग कर एक बहुत सरल तरीका है:

NSArray *filteredArray = [anArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF like %@", [pref stringByAppendingString:@"*"]]; 

यह जाँच करें कि यह आपके उपसर्ग एक वाइल्डकार्ड के बाद से बना स्ट्रिंग से मेल खाता द्वारा सरणी फिल्टर।

यदि आप उपसर्ग केस को असंवेदनशील रूप से देखना चाहते हैं, तो इसके बजाय like[c] का उपयोग करें।

+0

शानदार उत्तर। धन्यवाद! ;-) –

+1

धन्यवाद, मैंने शब्द में कहीं भी स्ट्रिंग की तुलना करने के लिए इसका इस्तेमाल किया: '[एनएसपी्रेडिकेट predicateWithFormat: @ "SELF जैसे [c]% @", [NSString stringWithFormat: @ "*% @ *", कीवर्ड]] ' – atulkhatri

1

आप -indexesOfObjectsPassingTest का उपयोग कर सकते हैं:। उदाहरण के लिए:

NSIndexSet* indexes = [anArray indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) { 
    return [obj hasPrefix:pref]; 
}]; 
NSArray* newArray = [anArray objectsAtIndexes:indexes]; 
1

आप NSArray कक्षा के indexOfObjectPassingTest: विधि का भी उपयोग कर सकते हैं। मैक ओएस एक्स v10.6 और बाद में में उपलब्ध है।

@implementation NSArray (hasPrefix) 

-(NSMutableArray *)filteredByPrefix:(NSString *)pref 
{ 
    NSMutableArray* newArray = [[NSMutableArray alloc] initWithCapacity:0]; 

    NSUInteger index = [self indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop) { 
     if ([ obj hasPrefix:pref]) { 
      [newArray addObject:obj]; 
      return YES; 
     } else 
      return NO; 
    }]; 

    return [newArray autorelease]; 

} 

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