simple1024 发表于 2013-2-5 09:45:58

Java汉字排序(汉字转拼音用pinyin4j)

package test;import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;/** * @className:PinyingUtil.java * @classDescription:拼音操作工具类 * @author:xiayingjie * @createTime:2010-10-21 */public class PinyinUtil {/** * 将字符串转换成拼音数组 ** @param src * @return */public static String[] stringToPinyin(String src) {return stringToPinyin(src, false, null);}/** * 将字符串转换成拼音数组 ** @param src * @return */public static String[] stringToPinyin(String src,String separator) {return stringToPinyin(src, true, separator);}/** * 将字符串转换成拼音数组 ** @param src * @param isPolyphone *            是否查出多音字的所有拼音 * @param separator *            多音字拼音之间的分隔符 * @return */public static String[] stringToPinyin(String src, boolean isPolyphone,String separator) {// 判断字符串是否为空if ("".equals(src) || null == src) {return null;}char[] srcChar = src.toCharArray();int srcCount = srcChar.length;String[] srcStr = new String;for (int i = 0; i < srcCount; i++) {srcStr = charToPinyin(srcChar, isPolyphone, separator);}return srcStr;}/** * 将单个字符转换成拼音 ** @param src * @return */public static String charToPinyin(char src, boolean isPolyphone,String separator) {// 创建汉语拼音处理类HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();// 输出设置,大小写,音标方式defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);StringBuffer tempPinying = new StringBuffer();// 如果是中文if (src > 128) {try {// 转换得出结果String[] strs = PinyinHelper.toHanyuPinyinStringArray(src,defaultFormat);// 是否查出多音字,默认是查出多音字的第一个字符if (isPolyphone && null != separator) {for (int i = 0; i < strs.length; i++) {tempPinying.append(strs);if (strs.length != (i + 1)) {// 多音字之间用特殊符号间隔起来tempPinying.append(separator);}}} else {tempPinying.append(strs);}} catch (BadHanyuPinyinOutputFormatCombination e) {e.printStackTrace();}} else {tempPinying.append(src);}return tempPinying.toString();}public static String hanziToPinyin(String hanzi){return hanziToPinyin(hanzi," ");}/** * 将汉字转换成拼音 * @param hanzi * @param separator * @return */@SuppressWarnings("deprecation")public static String hanziToPinyin(String hanzi,String separator){// 创建汉语拼音处理类HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();// 输出设置,大小写,音标方式defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);String pinyingStr="";try {pinyingStr=PinyinHelper.toHanyuPinyinString(hanzi, defaultFormat, separator);} catch (BadHanyuPinyinOutputFormatCombination e) {// TODO Auto-generated catch blocke.printStackTrace();}return pinyingStr;}/** * 将字符串数组转换成字符串 * @param str* @param separator 各个字符串之间的分隔符 * @return */public static String stringArrayToString(String[] str, String separator) {StringBuffer sb = new StringBuffer();for (int i = 0; i < str.length; i++) {sb.append(str);if (str.length != (i + 1)) {sb.append(separator);}}return sb.toString();}/** * 简单的将各个字符数组之间连接起来 * @param str * @return */publicstatic String stringArrayToString(String[] str){return stringArrayToString(str,"");}/** * 将字符数组转换成字符串 * @param str* @param separator 各个字符串之间的分隔符 * @return */public static String charArrayToString(char[] ch, String separator) {StringBuffer sb = new StringBuffer();for (int i = 0; i < ch.length; i++) {sb.append(ch);if (ch.length != (i + 1)) {sb.append(separator);}}return sb.toString();}/** * 将字符数组转换成字符串 * @param str* @return */public static String charArrayToString(char[] ch) {return charArrayToString(ch," ");}/** * 取汉字的首字母 * @param src * @param isCapital 是否是大写 * @return */public static char[]getHeadByChar(char src,boolean isCapital){//如果不是汉字直接返回if (src <= 128) {return new char[]{src};}//获取所有的拼音String []pinyingStr=PinyinHelper.toHanyuPinyinStringArray(src);//创建返回对象int polyphoneSize=pinyingStr.length;char [] headChars=new char;int i=0;//截取首字符for(String s:pinyingStr){char headChar=s.charAt(0);//首字母是否大写,默认是小写if(isCapital){headChars=Character.toUpperCase(headChar); }else{headChars=headChar; }i++;}return headChars;}/** * 取汉字的首字母(默认是大写) * @param src * @return */public static char[]getHeadByChar(char src){return getHeadByChar(src,true);}/** * 查找字符串首字母 * @param src* @return */publicstatic String[] getHeadByString(String src){return getHeadByString( src, true);}/** * 查找字符串首字母 * @param src* @param isCapital 是否大写 * @return */publicstatic String[] getHeadByString(String src,boolean isCapital){return getHeadByString( src, isCapital,null);}/** * 查找字符串首字母 * @param src* @param isCapital 是否大写 * @param separator 分隔符 * @return */publicstatic String[] getHeadByString(String src,boolean isCapital,String separator){char[]chars=src.toCharArray();String[] headString=new String;int i=0;for(char ch:chars){char[]chs=getHeadByChar(ch,isCapital);StringBuffer sb=new StringBuffer();if(null!=separator){int j=1;for(char ch1:chs){sb.append(ch1);if(j!=chs.length){sb.append(separator);}j++;}}else{sb.append(chs);}headString=sb.toString();i++;}return headString;}public static void main(String[] args) {System.out.println(PinyinUtil.stringArrayToString(getHeadByString("我的心肝爱上"),"-"));}} 
上面这个pinyinUtil类是pinyin4j包中的一个工具类,有多种方法供大家使用。
 
User类,相信不用再贴出来了,大家懂的。。。
 
下面这个类是实现排序的类了。
 
package test;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class HanZiSort {public static void main(String[] args) {    List<User> list=new ArrayList<User>();    User u=new User();    u.setName("张三");    u.setAge(21);    list.add(u);      u=new User();    u.setName("李四");    u.setAge(18);    list.add(u);      u=new User();    u.setName("王五");    u.setAge(25);    list.add(u);      u=new User();    u.setName("寒子");    u.setAge(89);    list.add(u);      for(User user: list) {      System.out.println(PinyinUtil.hanziToPinyin(user.getName()));    }    Collections.sort(list, new ToSort());//new ToSort() 根据需求定义排序    System.out.println("排序后!!!!!!!!!");    for(User user: list) {      System.out.println(PinyinUtil.hanziToPinyin(user.getName()));    }}}//排序class ToSort implements Comparator<User> {@Overridepublic int compare(User o1, User o2) {    // TODO Auto-generated method stub    String s1=PinyinUtil.hanziToPinyin(o1.getName());    String s2=PinyinUtil.hanziToPinyin(o2.getName());    if(s1.compareTo(s2)>0) {      return 1;    } else {      return -1;    }}} 结果:
zhang sanli siwang wuhan zi排序后!!!!!!!!!han zili siwang wuzhang san 
pinyin4j包在附件中。
 
页: [1]
查看完整版本: Java汉字排序(汉字转拼音用pinyin4j)