2012-04-04 5 views
5

그래서 기본적으로 NSArray이 있습니다.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

감사합니다. 단어의 어느 위치에서나 문자열을 비교하는 데 사용했습니다. [[NSPredicate predicateWithFormat : @ "SELF like [c] % @", [NSString stringWithFormat : @ "* % @ *", keyword]]' – atulkhatri

1

-indexesOfObjectsPassingTest :를 사용할 수 있습니다. 예를 들어 :

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

indexOfObjectPassingTest: 방법을 NSArray 클래스로 사용할 수도 있습니다. Mac OS X 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