1. 程式人生 > >中文通訊錄排序的一種實現方法

中文通訊錄排序的一種實現方法

在我們通訊錄中,聯絡人都是按一定的順序(字典順序)從上到下排列的。那麼對於儲存為中文的聯絡人,它的排序是怎樣實現的呢?

現行比較好理解,容易想到又通用的方法是先將中文轉換為拼音形式,再根據拼音各字母的ACSII碼大小比較從而實現排序目的。

1、申請兩個陣列A、B,A中儲存的是原始聯絡人資料

2、將陣列A中的漢字轉換為拼音:
iOS在CoreFoundation中提供了CFStringTransform函式,可將漢字轉換為拼音,它的定義如下:

Boolean CFStringTransform(CFMutableStringRef string, CFRange *range, CFStringRef transform, Boolean reverse);

引數說明:
string引數是要轉換的string,比如要轉換的中文,同時它是mutable的,因此也直接作為最終轉換後的字串。
range是要轉換的範圍,同時輸出轉換後改變的範圍,如果為NULL,視為全部轉換。
transform可以指定要進行什麼樣的轉換,這裡可以指定多種語言的拼寫轉換。
reverse指定該轉換是否必須是可逆向轉換的。

如果轉換成功就返回true,否則返回false。

如果要進行漢字到拼音的轉換,我們只需要將transform設定為
kCFStringTransformMandarinLatin或者kCFStringTransformToLatin
(kCFStringTransformToLatin也可適用於非漢字字串)

例項如下:
CFMutableStringRef string = CFStringCreateMutableCopy(NULL, 0, CFSTR(“中國”));
CFStringTransform(string, NULL, kCFStringTransformMandarinLatin, NO);
NSLog(@”%@”, string);
這段程式碼將輸出:
2013-11-22 14:41:14.644 Test[2436:907] zhōng guó

可以看出,CFStringTransform正確的輸出了“中國”的拼音,而且還帶上了音標。有時候我們不需要音標怎麼辦?還好CFStringTransform同時提供了將音標字母轉換為普通字母的方法kCFStringTransformStripDiacritics。我們在上面的程式碼基礎上再加上這個:

CFStringTransform(string, NULL, kCFStringTransformStripDiacritics, NO);
NSLog(@”%@”, string);

那麼最終將輸出:
2013-11-22 14:47:00.380 Test[2470:907] zhong guo

3、去掉拼音中的空白字元

4、將陣列A中聯絡人的拼音形式儲存到陣列B中,此時A與B中索引相同的元素儲存的是同一個人。在陣列B中的每個元素後面都加上該元素在陣列中的索引號。

5、對陣列B中的所有元素進行排序(按ACSII碼)。

6、顯示資料時,從陣列B中第一個元素開始,依次取出元素末尾的索引號,據此索引號去陣列A中提取相應位置的元素將其顯示出來,得到的顯示結果就是排好序的資料。