前言
在做相關(guān)項(xiàng)目,使用
融云作為IM模塊,做通訊錄模糊匹配功能
漢字轉(zhuǎn)拼音
- (NSString*)pinyinForSort:(BOOL)isForSurname withYindiao:(BOOL)bFlag;
{
NSString* convertString = self;
if (isForSurname)
{
//如果是姓名優(yōu)先去掉“·”符號(hào)
convertString = [self stringByReplacingOccurrencesOfString:@"·" withString:@""];
}
NSMutableString *mutableString = [NSMutableString stringWithString:convertString];
CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformToLatin, false);
if (bFlag)
{
NSString* pinyinString = [NSString stringWithString:mutableString];
NSMutableString* resultString = [NSMutableString stringWithString:pinyinString];
if (isForSurname)
{
//處理姓氏多音字
NSArray* allPolyphoneSurname = [[NSString getDicForAllPolyphoneSurnamePinYinWithYinDiao] allKeys];
for (NSString* tempPolyphoneSurname in allPolyphoneSurname)
{
if ([convertString hasPrefix:tempPolyphoneSurname])
{
NSArray* arrayOfPolyphoneSurnamePinYinWithYinDiao = [[NSString getDicForAllPolyphoneSurnamePinYinWithYinDiao] valueForKey:tempPolyphoneSurname];
NSString* rightPinYin = [arrayOfPolyphoneSurnamePinYinWithYinDiao objectAtIndex:0];
NSString* wrongPinYin = [arrayOfPolyphoneSurnamePinYinWithYinDiao objectAtIndex:1];
NSRange rangeOfPinYin = NSMakeRange(0, wrongPinYin.length);
if ([[resultString substringWithRange:rangeOfPinYin] isEqualToString:wrongPinYin])
{
[resultString replaceCharactersInRange:rangeOfPinYin withString:rightPinYin];
}
break;
}
}
}
return resultString;
}
else
{
NSString *pinyinString = [mutableString stringByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:[NSLocale currentLocale]];
NSMutableString* resultString = [NSMutableString stringWithString:pinyinString];
if (isForSurname)
{
//處理姓氏多音字
NSArray* allPolyphoneSurname = [[NSString getDicForAllPolyphoneSurnamePinYin] allKeys];
for (NSString* tempPolyphoneSurname in allPolyphoneSurname)
{
if ([convertString hasPrefix:tempPolyphoneSurname])
{
NSArray* arrayOfPolyphoneSurnamePinYin = [[NSString getDicForAllPolyphoneSurnamePinYin] valueForKey:tempPolyphoneSurname];
NSString* rightPinYin = [arrayOfPolyphoneSurnamePinYin objectAtIndex:0];
NSString* wrongPinYin = [arrayOfPolyphoneSurnamePinYin objectAtIndex:1];
NSRange rangeOfPinYin = NSMakeRange(0, wrongPinYin.length);
if ([[resultString substringWithRange:rangeOfPinYin] isEqualToString:wrongPinYin])
{
[resultString replaceCharactersInRange:rangeOfPinYin withString:rightPinYin];
}
break;
}
}
}
return resultString;
}
}
多音字
處理姓氏多音字
+ (NSDictionary*)getDicForAllPolyphoneSurnamePinYin;
{
static NSDictionary* g_pAllPolyphoneSurnamePinYin = nil;
static dispatch_once_t pred;
dispatch_once(&pred, ^
{
g_pAllPolyphoneSurnamePinYin = [NSMutableDictionary dictionaryWithObjectsAndKeys
:@[@"po",@"fan"],@"繁"
,@[@"ou",@"qu"],@"區(qū)"
,@[@"qiu",@"chou"],@"仇"
,@[@"chong",@"zhong"],@"種"
,@[@"shan",@"dan"],@"單"
,@[@"xie",@"jie"],@"解"
,@[@"zha",@"cha"],@"查"
,@[@"zeng",@"ceng"],@"曾"
,@[@"bi",@"mi"],@"秘"
,@[@"yue",@"le"],@"樂(lè)"
,@[@"chong",@"zhong"],@"重"
,@[@"piao",@"pu"],@"樸"
,@[@"miao",@"mou"],@"繆"
,@[@"zhai",@"di"],@"翟"
,@[@"she",@"zhe"],@"折"
,@[@"he",@"hei"],@"黑"
,@[@"ge",@"gai"],@"蓋"
,@[@"shen",@"chen"],@"沈"
,@[@"yu chi",@"wei chi"],@"尉遲"
,@[@"mo qi",@"wan qi"],@"萬(wàn)俟"
,nil];
});
return g_pAllPolyphoneSurnamePinYin;
}
模糊匹配
+ (NSArray*)filterFuzzySearchFromArray:(NSArray*)sourceArray withWildcards:(NSString*)wildcards
{
NSMutableString *searchWithWildcards = [@"*" mutableCopy];
[wildcards enumerateSubstringsInRange:NSMakeRange(0, [wildcards length])
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
[searchWithWildcards appendString:substring];
[searchWithWildcards appendString:@"*"];
}];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF LIKE[cd] %@", searchWithWildcards];
NSArray *filteredArray = [sourceArray filteredArrayUsingPredicate:predicate];
return filteredArray;
}
Demo
git地址TSFuzzySearchDemo