在開發(fā)過程中經(jīng)常碰見中文排序鞍匾,例如通訊錄列表港谊、城市列表等等。一開始解決方法吨述。解決思路根據(jù)每個中文的對應(yīng)的唯一的值,在數(shù)組中獲取中文的首字母钞脂。主要的代碼:
char pinyinFirstLetter(unsigned short hanzi)
{
int index = hanzi - HANZI_START;
if (index >= 0 && index <= HANZI_COUNT)
{
return firstLetterArray[index];
}
else
{
return hanzi;
}
}
代碼中的 firstLetterArray
就是存儲了中文的首字母的數(shù)組揣云。然而這個方法有一個缺陷,沒有解決中文中多音字的問題冰啃。如“重慶”(chong qing)首字母應(yīng)該是cq邓夕,但是程序獲得的是 zq。為了解決這個問題阎毅,重新找到了下面的另一個解決方法焚刚。主要代碼:
///處理多音字排序的問題
+(NSMutableArray *)pinYinHeteronySortWith:(NSArray *)unorderedArray{
NSMutableArray *pinYinArray=@[].mutableCopy;
NSMutableDictionary *dictXiaBiao = @{}.mutableCopy;
//第一步是轉(zhuǎn)成拼音
[unorderedArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSString *stringUnordered = (NSString *)obj;
NSMutableString *mutStringPinYin=@"".mutableCopy;
for (NSInteger i=0; i<stringUnordered.length; i++) {
//首先把字符串UniChar編碼一下
UniChar cc = [stringUnordered characterAtIndex:i];
//檢查該unicode碼是否在處理范圍之內(nèi),在則返回該碼對映漢字的拼音首字母,不在則調(diào)用其它函數(shù)處理
//首先查找多音字,這個地方需要手動去搜集扇调,耗時很大
if (cc < 40869 && cc > 19968) {
NSString *ccString = [NSString stringWithFormat:@"%d",cc];
// NSLog(@"UniChar編碼: %d",cc);
NSString *duoYinZi =[PinYinHeterony heteronymSortDictonary][ccString];
if (duoYinZi) {
//走到這個地方就是多音字了,這個地方需要處理一下多音字到底讀哪一個首字母
NSString *hh = [PinYinHeterony heteronymPhraseDictonaryWith:stringUnordered];
NSAssert(hh, @"你應(yīng)該向:heteronymPhraseDictonaryWith方法中添加多音字的首字母了");
mutStringPinYin = @"".mutableCopy;
[mutStringPinYin appendString:hh];
break;
}else{
[mutStringPinYin appendString:[NSString stringWithFormat:@"%c",[[PinYinHeterony chineseToPinYinBJDX] characterAtIndex:[ccString integerValue]-19968]]];
}
// NSLog(@"轉(zhuǎn)成拼音了: %@",stringPinYin);
}else{
NSLog(@"不在漢字范圍內(nèi)所以沒辦法轉(zhuǎn)拼音");
// NSAssert(NO, @"你應(yīng)該向:heteronymPhraseDictonaryWith方法中添加多音字的首字母了");
}
}
[pinYinArray addObject:mutStringPinYin];
[dictXiaBiao setObject:obj forKey:mutStringPinYin];
}];
[pinYinArray sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj1 compare:obj2]==NSOrderedDescending;
}];
NSLog(@" %@",pinYinArray);
NSMutableArray *relutArray = @[].mutableCopy;
[pinYinArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[relutArray addObject:dictXiaBiao[obj]];
}];
return relutArray;
}
這個方法的處理和上面的方法基本一樣只是多出了一個多音字的數(shù)組矿咕,該多音字字典需要自己手動添加。根據(jù)字典中的key(中文)獲取value(設(shè)置的首字母)狼钮,例如:@[@"重慶":@"CQ"]
碳柱。這個方法雖然解決上面的問題,但是每次遇到多音字都需要自己去添加熬芜。
重點來了:
今天看了KKBox的開發(fā)教材莲镣,知道了其實Apple自己為我們提供了排序方法:localizedCompare:
。localizedCompare:
是Apple提供的根據(jù)目前系統(tǒng)語言決定的排序方法涎拉,在中文簡體時可以進(jìn)行多音字的排序瑞侮。所以只需要[stringArr sortedArrayUsingSelector:@selector(localizedCompare:)];
就可以解決排序問題。
NSArray *stringArr = @[@"我們",@"我的", @"重點", @"重慶", @"三"];
NSArray *result = [stringArr sortedArrayUsingSelector:@selector(localizedCompare:)];
NSLog(@"%@", result);
輸出:
(
"重慶",
"三",
"我的",
"我們",
"重點"
)