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中文按照拼音排序
最新推荐文章于 2023-09-13 13:10:09 发布