iOS開發(fā)小技巧 - 中文排序

在開發(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);

輸出:

(
    "重慶",
    "三",
    "我的",
    "我們",
    "重點"
)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鼓拧,一起剝皮案震驚了整個濱河市半火,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌季俩,老刑警劉巖慈缔,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異种玛,居然都是意外死亡藐鹤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門赂韵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娱节,“玉大人,你說我怎么就攤上這事祭示∫蘼” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稠歉。 經(jīng)常有香客問我掰担,道長,這世上最難降的妖魔是什么怒炸? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任带饱,我火速辦了婚禮,結(jié)果婚禮上阅羹,老公的妹妹穿的比我還像新娘勺疼。我一直安慰自己,他們只是感情好捏鱼,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布执庐。 她就那樣靜靜地躺著,像睡著了一般导梆。 火紅的嫁衣襯著肌膚如雪轨淌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天看尼,我揣著相機(jī)與錄音猿诸,去河邊找鬼。 笑死狡忙,一個胖子當(dāng)著我的面吹牛梳虽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灾茁,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼窜觉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了北专?” 一聲冷哼從身側(cè)響起禀挫,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拓颓,沒想到半個月后语婴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡驶睦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年砰左,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片场航。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡缠导,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溉痢,到底是詐尸還是另有隱情僻造,我是刑警寧澤憋他,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站髓削,受9級特大地震影響竹挡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜立膛,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一揪罕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旧巾,春花似錦耸序、人聲如沸忍些。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罢坝。三九已至廓握,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘁酿,已是汗流浹背隙券。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留闹司,地道東北人娱仔。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像游桩,于是被迫代替她去往敵國和親牲迫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,500評論 25 707
  • 我們知道身上的這些缺點借卧,想著去改變盹憎,做夢去改變,但卻一點沒有變铐刘。 不知道是因為什么陪每,總是會把原本簡單的問題復(fù)雜化,...
    五音不全是種病閱讀 272評論 0 2
  • NHTSA指出镰吵,高達(dá)94%的汽車事故與人為失誤有關(guān)檩禾,因此強(qiáng)烈建議安裝ADAS主動安全系統(tǒng),包括前撞預(yù)警FCW疤祭,車道...
    捻心閱讀 233評論 0 0
  • 在我還不知道什么是結(jié)婚的時候锌订,我就經(jīng)常從父母的嘴中聽說過“離婚”這個詞,通常也是在我的父母劇烈爭吵之后画株,幼小的我就...
    性感有才的郭郭閱讀 253評論 0 2