歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

iOS開發中文首字母排序

因項目需要對通訊錄中的聯系人進行排序,需要對中文字符進行拼音轉換。其實這個轉換並沒有想象中的那麼難(因為我們只是把中文轉為拼音首字母而已,比如“王”轉換為字母w就可以了,而不需要轉換為完整的拼音wang)。對此,我們找到了一個簡便的解決辦法:一個老外(代碼中簽名的作者叫George)用c語言寫了一個pinyinFirstLetter函數用於獲取中文拼音首字母。

這個函數主要基於一個巨大的c語言char數組,把unicode字符集中所有中文的拼音首字母都映射進去了。

pinyinFirstLetter基於這麼一個簡單的原理:我們知道,在Objective C語言中,字符串是以unicode進行編碼的。在unicode字符集中,漢字的編碼范圍為4E00 到 9FA5 之間(即從第19968開始的20902個字符是中文簡體字符)。我們把這些字符的拼音首字母按照順序都存放在一個char數組中。當我們查找一個漢字的拼音首字母時,只需把這個漢字的unicode碼(即char強制轉換為int)減去19968,然後用這個數字作為索引去找char數組中存放的字母即可。

就這樣,有這個char數組為基礎,一切都變得非常簡單:

char pinyinFirstLetter(unsignedshort hanzi)

{

int index = hanzi - HANZI_START;

if (index >= 0&& index <= HANZI_COUNT)

{

returnfirstLetterArray[index];

}

else

{

return hanzi;

}

}

至於排序,我們可以把要排序的中文(為簡便起見,我們假設這些要排序的中文都只有一個字)放到NSArray中,然後利用NSArray的sortedArrayUsingComparator:方法進行排序即可。sortedArrayUsingComparator:方法是NSArray內部元素的比較方法。你只需要為這個方法提供一個塊作為參數即可。然後在這個塊中,對兩個元素的大小進行比較,並返回一個NSComparisonResult(NSComparisonResult枚舉用於表示比較的結果:等於、小於、大於):

NSArray *sortedArray=[mArray sortedArrayUsingComparator:^(id a, id b) {

            char c1=pinyinFirstLetter([(NSString*)a characterAtIndex:0]);

            char c2=pinyinFirstLetter([(NSString*)b characterAtIndex:0]);

            NSString* s1=[[NSStringstringWithFormat:@"%c",c1] uppercaseString];

            NSString* s2=[[NSStringstringWithFormat:@"%c",c2] uppercaseString];

            return [s1 compare:s2];

        }];

下面是程序運行的效果。你在“中文”一欄中,輸入幾個中文,然後點擊“轉換”按鈕,在下面“排序結果”一欄中顯示出這個幾個中文的首字母排序結果。

為簡便起見,我們沒有對第2個字母進行排序。因為這要求我們把每個中文的全拼映射到char數組中,這樣數組的大小會膨脹到一個可怕的數字。

Copyright © Linux教程網 All Rights Reserved