2012-04-04 35 views
5

Vì vậy, về cơ bản tôi có một số NSArray.Lọc các phần tử chuỗi NSArray

Tôi muốn lấy một mảng có nội dung của mảng ban đầu sau khi đã lọc các mảng đó, ví dụ: KHÔNG bắt đầu bằng một tiền tố đã cho.

Nó cho rằng sử dụng filteredArrayUsingPredicate: là cách tốt nhất; nhưng tôi không chắc chắn về cách tôi có thể làm điều đó ...

Đây là mã của tôi cho đến nay (trong một thể loại NSArray thực tế):

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

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

    return newArray; 
} 

Đó có phải là cách tiếp cận Cocoa thân thiện nhất? Những gì tôi muốn là một cái gì đó càng nhanh càng tốt ...

Trả lời

16

Đây là một cách đơn giản hơn nhiều bằng filteredArrayUsingPredicate::

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

này lọc mảng bằng cách kiểm tra rằng nó phù hợp với chuỗi tạo thành từ các tiền tố của bạn tiếp theo là một ký tự đại diện.

Nếu bạn muốn kiểm tra tiền tố phân biệt chữ hoa chữ thường, hãy sử dụng like[c] để thay thế.

+0

Câu trả lời hay. Cảm ơn! ;-) –

+1

Cảm ơn, tôi đã sử dụng điều này để so sánh chuỗi ở bất kỳ đâu trong từ: '[NSPredicate predicateWithFormat: @" SELF như [c]% @ ", [NSString stringWithFormat: @" *% @ * ", keyword]]' – atulkhatri

1

Bạn có thể sử dụng -indexesOfObjectsPassingTest :. Ví dụ:

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

Bạn cũng có thể sử dụng phương thức indexOfObjectPassingTest: của lớp NSArray. Có trong Mac OS X v10.6 trở lên.

@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 
Các vấn đề liên quan