Java編程實現中英混合字符串數組按首字母排序的方法
在Java中對於字符串數組的排序,我們可以使用Arrays.sort(String[])方法很便捷的進行排序。例如:
?1 2 3 4 5 6 7 |
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):
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/**
* 將字符串數字按首字母先後進行排序
*
* 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”,大家也可以自己嘗試自己寫排序算法去實現,鍛煉一下思維也不無壞處,呵呵。
PS:這裏再為大家推薦2款比較實用的相關在線排序工具供大家參考使用:
在線中英文根據首字母排序工具:
http://tools.jb51.net/aideddesign/zh_paixu
在線文本倒序翻轉排序工具:
http://tools.jb51.net/aideddesign/flipped_txt
下一頁 ?
Java編程實現中英混合字符串數組按首字母排序的方法