Java編程實現(xiàn)中英混合字符串數(shù)組按首字母排序的方法
本文實例講述了Java編程實現(xiàn)中英混合字符串數(shù)組按首字母排序的方法。分享給大家供大家參考,具體如下:
在Java中對于字符串數(shù)組的排序,我們可以使用Arrays.sort(String[])方法很便捷的進行排序。例如:
String[] arrays = new String[] { "gyu", "sdf", "zf", "大同", "收到", "地方", "三等分", "的人", "反對高鐵", "泛代數(shù)", "上的投入", "和國家" }; /*設(shè)置語言環(huán)境*/ Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA); Arrays.sort(arrays, com); for (String item:arrays) { System.out.print(item+" "); }
輸出的結(jié)果為:“gyu sdf zf 大同 的人 地方 反對高鐵 泛代數(shù) 和國家 三等分 上的投入 收到”;在Java中排列的順序是按照數(shù)字->英文->漢字進行排序的,這種排序方式可以滿足部分要求,但很多情況下我們并不希望這樣排列!例如Anroid中的通訊錄,音樂 列表等等,這些情形下我們希望英文首字母和中文拼音首字母一樣的排列在一起以方便查詢。由于這類排序算法很復雜,例如首字母相同的字符串還要接著比較第二個、第三個...。但是如果我們將jdk自帶的排序加以應(yīng)用就不會顯得那么復雜了;
我的想法是這樣的:既然Java中排序是按數(shù)字->英文->漢字來進行排序的,那我們就把每個漢字打頭的字符串前面加上一個該字符串第一個字符的拼音的首字母和一個區(qū)分符“&”,再使用jdk提供的排序函數(shù)進行排序,這時我們得到的就是我們想要的排序的數(shù)組了。然后再遍歷數(shù)組,將包含&符號的字符串去掉&和第一個英文字母便完成了整個排序了,具體實現(xiàn)代碼如下(獲取漢字拼音需要引用該jar:pinyin4j-2.5.0.jar):
/** * 將字符串數(shù)字按首字母先后進行排序 * * Java原生排序為 數(shù)字->英文->中文 * 為了將英文和中文首字母相同的排列到一起 * 先將字符串首字符為漢字的改為該漢字的首字母加上該字符串 * 為了以示區(qū)分中間再加一個分割符& * 然后使用Java原生排序算法 * 再將包含&字符的字符串中的&和首字母去除從而達到排序目的 * */ public static void main(String[] args) { String[] arrays = new String[] { "gyu", "sdf", "zf", "大同", "收到", "地方", "三等分", "的人", "反對高鐵", "泛代數(shù)", "上的投入", "和國家" }; for (int i = 0; i < arrays.length; i++) { String str = arrays[i]; if (str.length() == 0) return; String alphabet = str.substring(0, 1); /*判斷首字符是否為中文,如果是中文便將首字符拼音的首字母和&符號加在字符串前面*/ if (alphabet.matches("[\\u4e00-\\u9fa5]+")) { str = getAlphabet(str) + "&" + str; arrays[i] = str; } } /*設(shè)置排序語言環(huán)境*/ Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA); Arrays.sort(arrays, com); /*遍歷數(shù)組,去除標識符&及首字母*/ for (int i=0;i<arrays.length;i++) { String str=arrays[i]; if(str.contains("&")&&str.indexOf("&")==1){ arrays[i]=str.split("&")[1]; } System.out.println(arrays[i]); } } public static String getAlphabet(String str) { HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); // 輸出拼音全部小寫 defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); // 不帶聲調(diào) defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); String pinyin = null; try { pinyin = (String) PinyinHelper.toHanyuPinyinStringArray(str.charAt(0), defaultFormat)[0]; } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } return pinyin.substring(0, 1); }
這時輸出結(jié)果為:“大同 的人 地方 反對高鐵 泛代數(shù) gyu 和國家 三等分 上的投入 收到 sdf zf”,大家也可以自己嘗試自己寫排序算法去實現(xiàn),鍛煉一下思維也不無壞處,呵呵。
PS:這里再為大家推薦2款比較實用的相關(guān)在線排序工具供大家參考使用:
在線中英文根據(jù)首字母排序工具:
http://tools.jb51.net/aideddesign/zh_paixu
在線文本倒序翻轉(zhuǎn)排序工具:
http://tools.jb51.net/aideddesign/flipped_txt
希望本文所述對大家Java程序設(shè)計有所幫助。
上一篇:總結(jié)十個實用但偏執(zhí)的Java編程技術(shù)
欄 目:Java編程
下一篇:Java equals 方法與hashcode 方法的深入解析
本文標題:Java編程實現(xiàn)中英混合字符串數(shù)組按首字母排序的方法
本文地址:http://mengdiqiu.com.cn/a1/Javabiancheng/8490.html
您可能感興趣的文章
- 01-10Java咖啡館(1)——嘆咖啡
- 01-10Java Socket編程(三) 服務(wù)器Sockets
- 01-10Java進階:Struts多模塊的技巧
- 01-10Java Socket編程(一) Socket傳輸模式
- 01-10Java Socket編程(二) Java面向連接的類
- 01-10Java運行時多態(tài)性的實現(xiàn)
- 01-10Java經(jīng)驗點滴:處理沒有被捕獲的異常
- 01-10Java Socket編程(四) 重復和并發(fā)服務(wù)器
- 01-10Java中的浮點數(shù)分析
- 01-10面向?qū)ο缶幊?Java中的抽象數(shù)據(jù)類型


閱讀排行
本欄相關(guān)
- 01-10Java咖啡館(1)——嘆咖啡
- 01-10JVM的垃圾回收機制詳解和調(diào)優(yōu)
- 01-10Java Socket編程(三) 服務(wù)器Sockets
- 01-10Java進階:Struts多模塊的技巧
- 01-10J2SE 1.5版本的新特性一覽
- 01-10Java Socket編程(一) Socket傳輸模式
- 01-10Java運行時多態(tài)性的實現(xiàn)
- 01-10Java Socket編程(二) Java面向連接的類
- 01-10Java Socket編程(四) 重復和并發(fā)服務(wù)
- 01-10Java經(jīng)驗點滴:處理沒有被捕獲的異常
隨機閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?