在Java中對於字串數組的排序,我們可以使用Arrays.sort(String[])方法很便捷的進行排序。例如:
String[] arrays = new String[] { "gyu", "sdf", "zf", "大同", "收到","地方", "三等分", "的人", "反對高鐵", "泛代數", "上的投入", "和國家" };/*設定語言環境*/Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA);Arrays.sort(arrays, com);for (String item:arrays) {System.out.print(item+" ");}
輸出的結果為:“gyu sdf zf 大同 的人 地方 反對高鐵 泛代數 和國家 三等分 上的投入 收到”;在Java中排列的順序是按照數字->英文->漢字進行排序的,這種排序方式可以滿足部分要求,但很多情況下我們並不希望這樣排列!例如Anroid中的通訊錄,音樂播放清單等等,這些情形下我們希望英文首字母和中文拼音首字母一樣的排列在一起以方便查詢。由於這類排序演算法很複雜,例如首字母相同的字串還要接著比較第二個、第三個...。但是如果我們將jdk內建的排序加以應用就不會顯得那麼複雜了;
我的想法是這樣的:既然Java中排序是按數字->英文->漢字來進行排序的,那我們就把每個漢字打頭的字串前面加上一個該字串第一個字元的拼音的首字母和一個區分符“&”,再使用jdk提供的排序函數進行排序,這時我們得到的就是我們想要的排序的數組了。然後再遍曆數組,將包含&符號的字串去掉&和第一個英文字母便完成了整個排序了,具體實現代碼如下(擷取漢字拼音需要引用該jar:pinyin4j-2.5.0.jar):
/** * 將字串數字按首字母先後進行排序 * * Java原生排序為 數字->英文->中文 * 為了將英文和中文首字母相同的排列到一起 * 先將字串首字元為漢字的改為該漢字的首字母加上該字串 * 為了以示區分中間再加一個分割符& * 然後使用Java原生排序演算法 * 再將包含&字元的字串中的&和首字母去除從而達到排序目的 * */public static void main(String[] args) {String[] arrays = new String[] { "gyu", "sdf", "zf", "大同", "收到","地方", "三等分", "的人", "反對高鐵", "泛代數", "上的投入", "和國家" };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;}}/*設定排序語言環境*/Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA);Arrays.sort(arrays, com);/*遍曆數組,去除標識符&及首字母*/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);// 不帶聲調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);}
這時輸出結果為:“大同 的人 地方 反對高鐵 泛代數 gyu 和國家 三等分 上的投入 收到 sdf zf”,大家也可以自己嘗試自己寫排序演算法去實現,鍛煉一下思維也不無壞處,呵呵。