2013-04-21 48 views
1

回答感謝所有幫助。就發佈而言,我是新的堆棧溢出,所以如果我的編輯很混亂,我很抱歉。下面的代碼是我最終想出來的,並認爲它可以幫助其他人,儘管我相信最後回答的人也可能會產生類似的結果。較不敏感的字符串比較

我一直在尋找一段時間,我相信我可以打破這一點,並使用幾條馬虎的if語句完成它,但我正在尋找一種常見的,有效的方法。

我有一個典型的字符串比較搜索。對於使用NSRange的數組中的每個字符串,我從中得到的結果可能會很挑剔。

如果我有例如Bat Man一個字符串我可以用搜索BatMan找到它,但沒有一次我添加mbatBatm

我想我要找的是,如果字符存在於字符串內而不是那個字符串。

 -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 


[roomsList removeAllObjects]; 
stringScore = 0; 


// clear 
if([searchText length] == 0){ 

    searchingRooms = NO; 

    [roomsList addObjectsFromArray:[newDataManager shared].rooms]; 
    [self.gsgSearchBar resignFirstResponder]; 

    // search users 
}else{ 



    searchingRooms = YES; 

    for(QBChatRoom *room in [newDataManager shared].rooms){ 
     stringScore = 0; 
     NSString* newRoomNameText = [room.name stringByReplacingOccurrencesOfString:@"_" withString:@""]; 

     NSString* newSearchText = [searchText stringByReplacingOccurrencesOfString:@" " withString:@""]; 




     for(int i = 0 ;i<[newSearchText length]; i++) { 
      char mySearchChar = [newSearchText characterAtIndex:i]; 

      lastSearchString = [NSString stringWithFormat:@"%c",mySearchChar]; 

      NSRange searchRange = [newRoomNameText rangeOfString:lastSearchString options:NSCaseInsensitiveSearch]; 
      if (searchRange.location != NSNotFound){ 
       stringScore = stringScore + 1; 
       if (stringScore == newSearchText.length) { 
        [roomsList addObject:room]; 

       } 



      }}}} 


[gsgTableView reloadData]; 
} 
+0

如果您在運行比較之前只是將兩個字符串小寫併除去'[a-z]'之外的任何字符,那該怎麼辦?謝謝。 – aroth 2013-04-21 23:26:56

+0

可能工作不愉快。 – rezand 2013-04-21 23:38:14

回答

0

您可以使用謂詞來解決此問題。它們在過濾陣列時非常方便。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Self contains[c] %@",self.searchString.text]; 

NSArray *filteredArray = [self.superHeroesArray filteredArrayUsingPredicate:predicate]; 

contains後添加[c]可確保搜索不區分大小寫。