package com.zx.test;
import java.text.Collator;
import java.text.ParseException;
import java.text.RuleBasedCollator;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
public class SortChinese {
public static void main(String[] args) {
// simpleSortChina();
String[] chinaStrs = new String[] { "作業", "測試", "Zhang", "test", "我們",
"凹凸曼", "李四", "科比", "xin86", "Xin86", "zhang", "ao", "凹吧" };
java.util.Arrays.sort(chinaStrs, new ChineseGB2312Comparator());
for (String key : chinaStrs)
System.out.print(key + " ");
}
public static void simpleSortChina() {
String[] chinaStrs = new String[] { "作業", "測試", "Zhang", "test", "我們",
"凹凸曼", "李四", "科比", "xin86", "Xin86", "zhang", "ao", "凹吧" };
Arrays.sort(chinaStrs, RuleBasedCollator.getInstance(Locale.CHINA));
for (String string : chinaStrs) {
System.out.print(string + " ");
}
}
}
/**
* RuleBasedCollator 類 getRules() 方法可以返回對應語言的規則設置。簡體中文對應的規則是 gb2312 所對應的字符。
* 我們可以把其中的全部漢字提取出來 對這些漢字重新排序 利用RuleBasedCollator(String rules) 構造器新建一個定製的
* RuleBasedCollator
*
* @author 新
*
*/
class ChineseGB2312Collator {
/**
* @return a customized RuleBasedCollator with Chinese characters (GB2312)
* sorted correctly
*/
public static final RuleBasedCollator getFixedGB2312Collator() {
RuleBasedCollator fixedGB2312Collator = null;
try {
fixedGB2312Collator = new java.text.RuleBasedCollator(
ChineseGB2312Collator.getGB2312SpecialChars() + GB2312Chars);
} catch (ParseException e) {
e.printStackTrace();
}
return fixedGB2312Collator;
}
/**
* @return the special characters in GB2312 charset.
*
*/
public static final String getGB2312SpecialChars() {
RuleBasedCollator zh_CNCollator = (RuleBasedCollator) Collator
.getInstance(Locale.CHINA);
// index 2125 is the last symbol "╋"
return zh_CNCollator.getRules().substring(0, 2125);
}
/**
* 6763 Chinese characters in GB2312 charset
*/
public static final String GB2312Chars = "<吖<阿<啊< 錒<嗄<哎<哀<唉<埃<挨<鎄<捱<皚<癌<噯<矮<藹< 靄<艾<愛<砹<隘<嗌<嬡<礙<曖<璦<安<桉<氨<庵< 諳<鵪<鞍<俺<垵<銨<揞<犴<岸<按<案<胺<暗<黯< 骯<昂<盎<凹<坳<敖<嗷<廒<獒<遨<熬<翱<聱<螯< 鰲<鏖<拗<襖<媼<嶴<傲<奧<驁<澳<懊<鏊"
+ "<八<巴<叭< 扒<吧<岜<芭<疤<捌<笆<粑<拔<茇<菝<跋<魃<把< 鈀<靶<壩<爸<罷<鮁<霸<灞<掰<白<百<佰<柏<捭< 擺<唄<敗<拜<稗<扳<班<般<頒<斑<搬<瘢<癍<阪< 阪<板<版<鈑<舨<辦<半<伴<扮<拌<絆<瓣<邦<幫< 梆<浜<綁<榜<膀<蚌<傍<棒<謗<蒡<磅<鎊<勹<包< 孢<苞<胞<煲<齙<褒<雹<寶<飽<保<鴇<堡<葆<褓< 報<抱<豹<趵<鮑<暴<爆<陂<卑<杯<悲<碑<鵯<北< 貝<狽<邶<備<背<鋇<倍<悖<被<憊<焙<輩<碚<蓓< 褙<鞴<鐾<奔<賁<錛<本<苯<畚<坌<笨<崩<繃<嘣< 甭<泵<迸<甏<蹦<逼<荸<鼻<匕<比<吡<妣<彼<秕< 俾<筆<舭<鄙<幣<必<畢<閉<庇<畀<嗶<毖<蓽<陛< 斃<狴<鉍<婢<庳<敝<萆<弼<愎<篳<潷<痹<蓖<裨< 蹕<闢<弊<碧<箅<蔽<壁<嬖<篦<薜<避<濞<臂<髀< 璧<襞<邊<砭<籩<編<煸<蝙<鯿<鞭<貶<扁<窆<匾< 碥<褊<卞<弁<忭<汴<苄<拚<便<變<緶<遍<辨<辯< 辮<灬<杓<彪<標<颮<髟<驃<膘<瘭<鏢<飆<飈<鑣< 表<婊<裱<鰾<憋<鱉<別<蹩<癟<賓<彬<儐<斌<濱< 繽<檳<鑌<瀕<豳<擯<殯<臏<髕<鬢<冫<冰<兵<丙< 邴<秉<柄<炳<餅<稟<並<病<摒<撥<波<玻<剝<鉢< 餑<啵<脖<菠<播<伯<孛<駁<帛<泊<勃<亳<鈸<鉑< 舶<博<渤<鵓<搏<箔<膊<踣<薄<礴<跛<簸<擘<檗< 逋<鈽<晡<醭<卜<卟<補<哺<捕<不<布<步<怖<鈈< 部<埠<瓿<簿";
}
/**
* ChineseGB2312Comparator 類同時實現了 Comparator, Comparable 接口,這樣以後能夠使用 compare,
* compareTo 方法的時候都可以使用這個類
*
* @author 新
*
*/
class ChineseGB2312Comparator implements Comparator<String>, Comparable<String> {
private RuleBasedCollator GB2312Collator = ChineseGB2312Collator
.getFixedGB2312Collator();
private String str1;
/**
* @param str1
*/
public ChineseGB2312Comparator(String str1) {
this.str1 = str1;
}
/**
*
*/
public ChineseGB2312Comparator() {
this.str1 = "";
}
/**
* @param str1
* @param str2
* @return an integer indicatint the comparison result
* @see java.util.Comparator#compare(Object, Object)
*/
public int compare(String str1, String str2) {
return GB2312Collator.compare(str1, str2);
}
/**
* @param str2
* @return an integer indicatint the comparison result
* @see java.lang.Comparable#compareTo(Object)
*/
public int compareTo(String str2) {
return GB2312Collator.compare(str1, str2);
}
}
class CodeNameBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 對List列表按中文拼音排序的實現方式:
/**
* 對List字符串數組進行排序
*
* @author Administrator
*
*/
class ComparatorList implements Comparator<Object> {
public int compare(Object value1, Object value2) {
// http://j2ee-yohn.javaeye.com/blog/272006 此帖子關於中文拼音排序很詳細。
// TODO Auto-generated method stub
if (value1.getClass().getName()
.equals("org.openjweb.core.util.CodeNameBean")) {
String s1 = ((CodeNameBean) value1).getName().toString();
String s2 = ((CodeNameBean) value2).getName().toString();
return Collator.getInstance(Locale.CHINESE).compare(s1, s2);
} else if (value1.getClass().getName().equals("java.lang.String")) {
String s1 = value1.toString();
String s2 = value2.toString();
return Collator.getInstance(Locale.CHINESE).compare(s1, s2);
}
return 0; // 0表示相同。
}
public static List<?> sort(List<?> strList) {
ComparatorList comp = new ComparatorList();
Collections.sort(strList, comp);
return strList; // 返回排序後的列表
}
}
// 具體調用時,可使用下面的語句 list = ComparatorList.sort(list); 這樣傳入一個原始的
// list,返回一個經過排序後的list,排序後。上面的實現是按照字母表的順序從A..Z的發音順序排列的。
含中文的List列表按中文拼音排序的實現方式 Java
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.