java中文排序(使用pinyin4j)

如下比较器实现了汉字按照字母顺序进行排序,输入字符为英文字符将会排在汉字之前。可将待排序的DevelopmentGuideFolder放在list中,然后使用Collections.sort(list, new ZhongWenComparator());进行排序。

 

/**
* 汉字比较器.
*/
public static class ZhongWenComparator implements Comparator<DevelopmentGuideFolder>{
private final static Log log = LogFactory.getLog(ZhongWenComparator.class);

@Override
public int compare(DevelopmentGuideFolder df1, DevelopmentGuideFolder df2) {
char[] df1NameAry = df1.getName().toCharArray();
char[] df2NameAry = df2.getName().toCharArray();
int len1 = df1NameAry.length;
int len2 = df2NameAry.length;

//循环len1与len2较小的那个次数
for(int i = 0; i < len1 && i < len2; i++){
//都是英文字符
if(df1NameAry[i] < 128 && df2NameAry[i] < 128){
//相同字符,继续比较
if(df1NameAry[i] == df2NameAry[i])
continue;
return df1NameAry[i] - df2NameAry[i];
//都是中文(编码在128之外的按照中文处理)
}else if(df1NameAry[i] >= 128 && df2NameAry[i] >= 128){
//相同汉字,继续比较
if(df1NameAry[i] == df2NameAry[i])
continue;
return hanziToPinyin(df1NameAry[i]).compareTo(hanziToPinyin(df2NameAry[i]));
//第一个字符是汉字,第二个字符是英文字符
}else if(df1NameAry[i] >= 128){
return 1;
//第二个字符是汉字,第一个字符是英文字符
}else if(df2NameAry[i] >= 128){
return -1;
}
}

//for循环中未能比较出结果,
//说明两个字符串相同或是长一点的字符串包含短一点的字符串
if(len1 == len2)
return 0;
else if(len1 > len2)
return 1;
else
return -1;
}

public static String hanziToPinyin(char hanzi){
StringBuffer sb = new StringBuffer();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
if(hanzi > 128){
try{
sb.append(PinyinHelper.toHanyuPinyinStringArray(hanzi, defaultFormat)[0]);
}catch(BadHanyuPinyinOutputFormatCombination e){
log.info("将中文'" + hanzi + "'转换为拼音时出现异常",e);
}
}else{
sb.append(hanzi);
}

return sb.toString();
}

public static void main(String[] args){
DevelopmentGuideFolder df1 = new DevelopmentGuideFolder();
df1.setName("development");
DevelopmentGuideFolder df2 = new DevelopmentGuideFolder();
df2.setName("develop");
DevelopmentGuideFolder df3 = new DevelopmentGuideFolder();
df3.setName("推土a机斯");
DevelopmentGuideFolder df4 = new DevelopmentGuideFolder();
df4.setName("推土b机");



List<DevelopmentGuideFolder> dfList = new ArrayList<DevelopmentGuideFolder>();
dfList.add(df1);
dfList.add(df2);
dfList.add(df3);
dfList.add(df4);
Collections.sort(dfList, new ZhongWenComparator());

for(DevelopmentGuideFolder df : dfList){
System.out.println(df.getName());
}


}

}

public class DevelopmentGuideFolder implements Serializable{

private static final long serialVersionUID = 1L;

private String id;
private String name;
private DevelopmentGuideFolder parent;
private List<DevelopmentGuideFolder> children;
private List<DevelopmentGuide> developmentGuideList;
private List<User> relatedUsers;

public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public DevelopmentGuideFolder getParent() {
return parent;
}
public void setParent(DevelopmentGuideFolder parent) {
this.parent = parent;
}
public List<DevelopmentGuideFolder> getChildren() {
return children;
}
public void setChildren(List<DevelopmentGuideFolder> children) {
this.children = children;
}
public List<DevelopmentGuide> getDevelopmentGuideList() {
return developmentGuideList;
}
public void setDevelopmentGuideList(List<DevelopmentGuide> developmentGuideList) {
this.developmentGuideList = developmentGuideList;
}
public void setRelatedUsers(List<User> relatedUsers) {
this.relatedUsers = relatedUsers;
}
public List<User> getRelatedUsers() {
return relatedUsers;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值