不太敏感的字符串比较

时间:2013-04-21 23:24:57

标签: ios objective-c nsstring

回答感谢所有帮助。我是新的堆栈溢出,所以如果我的编辑是凌乱我道歉。下面的代码是我最终想出来的,并认为它可以帮助其他人,虽然我相信最后回答的人也可能产生类似的结果。

我一直在寻找一段时间,我相信我可以打破这一点并用一些草率的if语句来完成它,但我正在寻找一种通用,有效的方法。

我有一个典型的字符串比较搜索。对于使用NSRange的数组中的每个字符串,但我从中得到的结果可能很挑剔。

如果我有一个字符串,例如Bat Man我可以通过搜索BatMan找到它,但不能在m添加bat后找到它Batm

我猜我正在寻找的是字符串中是否存在字符而不是字符串。

     -(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];
}

1 个答案:

答案 0 :(得分:0)

您可以使用谓词来解决此问题。它们在过滤数组时非常方便。

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

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

[c]之后添加contains可确保搜索不区分大小写。