ios專案中會用到對通訊錄的聯絡人或是會員按姓名為關鍵字排序,因為nsarray並不直接支援對漢字的排序,這就要通過將漢字轉換成拼音完成按a~z的排序,這看起來是個頭疼的問題,因為牽扯到漢字轉為拼音,kmyhy給出乙個較易實現的方法,獲取漢字的首字的首字母,如將「王」變成「w」,完整文章(傳送門)。
其中他通過pinyinfirstletter函式獲取中文拼音,函式原理是:「pinyinfirstletter基於這麼乙個簡單的原理:我們知道,在objective c語言中,字串是以unicode進行編碼的。在unicode字符集中,漢字的編碼範圍為4e00 到 9fa5 之間(即從第19968開始的20902個字元是中文簡體字符)。我們把這些字元的拼音首字母按照順序都存放在乙個char陣列中。當我們查詢乙個漢字的拼音首字母時,只需把這個漢字的unicode碼(即char強制轉換為int)減去19968,然後用這個數字作為索引去找char陣列中存放的字母即可。」函式**我也貼了過來。
[cpp]view plain
copy
print?
char
pinyinfirstletter(unsignedshort hanzi)
else
} 這個方法真是用很原理的東西,解決乙個巧妙問題,但也存在乙個問題:不支援漢字(首字)的第二個字母的排序,據說對映的char陣列會很大。這裡我給出我的方法,先在cocoatouch框架上看看有什麼能用到的,在nsstring有乙個函式localizedcompare:,它的功能是通過自身與給定字串的比較,返回乙個本地化的比較結果,也就是說這個函式是支援漢字比較的。
進一步localizedcompare:只是字串與字串的比較,我們要讓nsarray陣列通過按關鍵字為漢字字串排序,我們繼續在nsarray的sdk上下功夫,我們發現除了sortdarrayusingdescriptors:通過nssortdescriptor排序;還有sotedarrayusingfunction:context:,這個函式支援我們自定義乙個函式制定比較規則,返回比較結果,這樣問題一下便解決了。我先把**貼出來。
[cpp]view plain
copy
print?
nsinteger nicknamesort(id user1, id user2,
void
*context)
{ user *u1,*u2;
//型別轉換
u1 = (user*)user1;
u2 = (user*)user2;
return
[u1.nickname localizedcompare:u2.nickname
];
}
在需要比較地方,呼叫比較函式
[cpp]view plain
copy
print?
sortarr = [arr sortedarrayusingfunction:nicknamesort context:null];
需要的**很少吧,這樣做會有幾方面的好處:1 支援多個漢字按字母序排序(若第乙個字的第乙個字母相同,則按第乙個字的第二個字母比較,若第乙個字的字母完全相同,按第二個字的首字母繼續排序)。 2 原本可能需要儲存漢字拼音的地方,現在不需要了。 3 可以通過對nicknamesortde進一步定製,完成更複雜的比較,比如先比較會員狀態,在按姓名字母序完成比較。4 整體結構簡單 使用的都是cocatouch框架下的的方法。
再感嘆一句,cocatouch你真厲害
**:
中文首字母 排序
因專案需要對通訊錄中的聯絡人進行排序,需要對中文字元進行拼音轉換。其實這個轉換並沒有想象中的那麼難 因為我們只是把中文轉為拼音首字母而已,比如 王 轉換為字母w就可以了,而不需要轉換為完整的拼音wang 對此,我們找到了乙個簡便的解決辦法 乙個老外 中簽名的作者叫george 用c語言寫了乙個pin...
pinyin中文首字母排序
pinyin中文首字母排序 子木瀟雨 因 專案需要對通訊錄中的聯絡人進行排序,需要對中文字元進行拼音轉換。其實這個轉換並沒有想象中的那麼難 因為我們只是把中文轉為拼音首字母而已,比如 王 轉換為字母w就可以了,而不需要轉換為完整的拼音wang 對此,我們找到了乙個簡便的解決辦法 乙個老外 中簽名的作...
pinyin中文首字母排序
因專案需要對通訊錄中的聯絡人進行排序,需要對中文字元進行拼音轉換。其實這個轉換並沒有想象中的那麼難 因為我們只是把中文轉為拼音首字母而已,比如 王 轉換為字母w就可以了,而不需要轉換為完整的拼音wang 對此,我們找到了乙個簡便的解決辦法 乙個老外 中簽名的作者叫george 用c語言寫了乙個pin...