2014-10-30 161 views
1

的NSMutableArray的一個子我有一個像查找字符串快速

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"How many degrees ", @"Which club degree", @"body building", nil]; 

的陣列要篩選只有那些字符串包含的程度。我使用的舊IOS,我沒有[string stringcontains]方法

所要求陣列必須有 - > 1.多少度2.我用哪個俱樂部程度

第一種方法

NSString *[email protected]"degree"; 

    for (NSString *description in arr) 
    { 
    NSComparisonResult result = [description compare:strToMatch options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [strToMatch length])]; 

      if (result == NSOrderedSame) 
       { 
       // statement to run on comparison succeeded.. 
       } 
    } 

第二種方法

for (NSString *description in arr) 
    { 

     if ([description rangeOfString:strToMatch options:NSCaseInsensitiveSearch].location != NSNotFound) 
     { 
      NSLog(@"I am matched...."); 
     } 
    } 

這是工作的罰款。我向您展示了比較單個字符串的代碼,但我必須將此數組與另一個字符串數組進行比較。我想加快我的代碼。有沒有其他更好的方法來找到它。

以及我們如何創建一個NSPredicate比較兩個字符串數組中。查找字符串的第一個字符串作爲第二個數組中的子字符串。

和做法是快。

在此先感謝。

回答

3

您可以使用NSPredicate-[NSArray filteredArrayUsingPredicate:],因爲它是可用的iOS 3.0

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"How many degrees ", @"Which club degree", @"body building", nil]; 
NSString *searchText = @"degree"; 
NSArray *filtered = [arr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self contains %@", searchText]]; 

而且不區分大小寫和變音符號不敏感的搜索使用

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"How many degrees ", @"Which club degree", @"body building", nil]; 
NSString *searchText = @"deGree"; 
NSArray *filtered = [arr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self contains[cd] %@", searchText]]; 

如果你要搜索的關鍵字數組另一個陣列,你可以使用NSCompoundPredicate,這也可以從iOS 3.0中獲得。

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"How many degrees ", @"Which club degree", @"body building", @"hello world" , nil]; 
NSArray *keywordsToSearch = @[@"deGree", @"world"]; 
NSMutableArray *predicates = [NSMutableArray new]; 
for (NSString *keyword in keywordsToSearch) { 
    [predicates addObject:[NSPredicate predicateWithFormat:@"self contains[cd] %@", keyword]]; 
} 
NSPredicate *wholePredicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicates]; 

NSArray *filtered = [arr filteredArrayUsingPredicate:wholePredicate]; 

此外,你可以檢查性能,並選擇最好的一個。

NSTimeInterval startTime = [[NSDate date] timeIntervalSince1970]; 
// .... here searching code 
NSTimeInterval endTime = [[NSDate date] timeIntervalSince1970]; 
NSLog(@"Duration %f", endTime - startTime); 
+2

運行完美,但告訴我,這方法是快速的,當NSPredicate或我的方式.. – Nepster 2014-10-30 09:54:37

+0

我認爲蘋果的實現應該更快之間進行選擇,但無論如何,我加入了性能的代碼,檢查我的編輯。 – l0gg3r 2014-10-30 10:21:46

+1

謝謝,我是IOS新手,你可以給我建議一些網站或教程,通過它我可以增強我關於IOS的概念。不是code.I想學習概念。 – Nepster 2014-10-30 10:25:18