2013-04-21 46 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]可确保搜索不区分大小写。