在我們通訊錄中,聯系人都是按一定的順序(字典順序)從上到下排列的。那么對于保存為中文的聯系人,它的排序是怎樣實現的呢?
現行比較好理解,容易想到又通用的方法是先將中文轉換為拼音形式,再根據拼音各字母的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中提取相應位置的元素將其顯示出來,得到的顯示結果就是排好序的數據。
新聞熱點
疑難解答