较不敏感的字符串比较
问题描述:
回答感谢所有帮助。就发布而言,我是新的堆栈溢出,所以如果我的编辑很混乱,我很抱歉。下面的代码是我最终想出来的,并认为它可以帮助其他人,尽管我相信最后回答的人也可能会产生类似的结果。较不敏感的字符串比较
我一直在寻找一段时间,我相信我可以打破这一点,并使用几条马虎的if语句完成它,但我正在寻找一种常见的,有效的方法。
我有一个典型的字符串比较搜索。对于使用NSRange
的数组中的每个字符串,我从中得到的结果可能会很挑剔。
如果我有例如Bat Man
一个字符串我可以用搜索Bat
或Man
找到它,但没有一次我添加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];
}
答
您可以使用谓词来解决此问题。它们在过滤阵列时非常方便。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Self contains[c] %@",self.searchString.text];
NSArray *filteredArray = [self.superHeroesArray filteredArrayUsingPredicate:predicate];
contains
后添加[c]
可确保搜索不区分大小写。
如果您在运行比较之前只是将两个字符串小写并除去'[a-z]'之外的任何字符,那该怎么办?谢谢。 – aroth 2013-04-21 23:26:56
可能工作不愉快。 – rezand 2013-04-21 23:38:14