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

Pinyin4j中的pinyinutil类代码   收藏代码
  1. package test;  
  2.   
  3. import net.sourceforge.pinyin4j.PinyinHelper;  
  4. import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;  
  5. import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;  
  6. import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;  
  7. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;  
  8.   
  9. /**  
  10.  * @className:PinyingUtil.java  
  11.  * @classDescription:拼音操作工具类  
  12.  * @author:xiayingjie  
  13.  * @createTime:2010-10-21  
  14.  */  
  15.   
  16. public class PinyinUtil {  
  17.   
  18.     /**  
  19.      * 将字符串转换成拼音数组  
  20.      *   
  21.      * @param src  
  22.      * @return  
  23.      */  
  24.     public static String[] stringToPinyin(String src) {  
  25.         return stringToPinyin(src, false, null);  
  26.     }  
  27.     /**  
  28.      * 将字符串转换成拼音数组  
  29.      *   
  30.      * @param src  
  31.      * @return  
  32.      */  
  33.     public static String[] stringToPinyin(String src,String separator) {  
  34.         return stringToPinyin(src, true, separator);  
  35.     }  
  36.   
  37.     /**  
  38.      * 将字符串转换成拼音数组  
  39.      *   
  40.      * @param src  
  41.      * @param isPolyphone  
  42.      *            是否查出多音字的所有拼音  
  43.      * @param separator  
  44.      *            多音字拼音之间的分隔符  
  45.      * @return  
  46.      */  
  47.     public static String[] stringToPinyin(String src, boolean isPolyphone,  
  48.             String separator) {  
  49.         // 判断字符串是否为空  
  50.         if ("".equals(src) || null == src) {  
  51.             return null;  
  52.         }  
  53.         char[] srcChar = src.toCharArray();  
  54.         int srcCount = srcChar.length;  
  55.         String[] srcStr = new String[srcCount];  
  56.   
  57.         for (int i = 0; i < srcCount; i++) {  
  58.             srcStr[i] = charToPinyin(srcChar[i], isPolyphone, separator);  
  59.         }  
  60.         return srcStr;  
  61.     }  
  62.   
  63.     /**  
  64.      * 将单个字符转换成拼音  
  65.      *   
  66.      * @param src  
  67.      * @return  
  68.      */  
  69.     public static String charToPinyin(char src, boolean isPolyphone,  
  70.             String separator) {  
  71.         // 创建汉语拼音处理类  
  72.         HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();  
  73.         // 输出设置,大小写,音标方式  
  74.         defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
  75.         defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  
  76.   
  77.         StringBuffer tempPinying = new StringBuffer();  
  78.           
  79.   
  80.         // 如果是中文  
  81.         if (src > 128) {  
  82.             try {  
  83.                 // 转换得出结果  
  84.                 String[] strs = PinyinHelper.toHanyuPinyinStringArray(src,  
  85.                         defaultFormat);  
  86.                   
  87.                           
  88.                 // 是否查出多音字,默认是查出多音字的第一个字符  
  89.                 if (isPolyphone && null != separator) {  
  90.                     for (int i = 0; i < strs.length; i++) {  
  91.                         tempPinying.append(strs[i]);  
  92.                         if (strs.length != (i + 1)) {  
  93.                             // 多音字之间用特殊符号间隔起来  
  94.                             tempPinying.append(separator);  
  95.                         }  
  96.                     }  
  97.                 } else {  
  98.                     tempPinying.append(strs[0]);  
  99.                 }  
  100.   
  101.             } catch (BadHanyuPinyinOutputFormatCombination e) {  
  102.                 e.printStackTrace();  
  103.             }  
  104.         } else {  
  105.             tempPinying.append(src);  
  106.         }  
  107.   
  108.         return tempPinying.toString();  
  109.   
  110.     }  
  111.   
  112.       
  113.     public static String hanziToPinyin(String hanzi){  
  114.         return hanziToPinyin(hanzi," ");  
  115.     }  
  116.     /**  
  117.      * 将汉字转换成拼音  
  118.      * @param hanzi  
  119.      * @param separator  
  120.      * @return  
  121.      */  
  122.     @SuppressWarnings("deprecation")  
  123.   public static String hanziToPinyin(String hanzi,String separator){  
  124.             // 创建汉语拼音处理类  
  125.             HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();  
  126.             // 输出设置,大小写,音标方式  
  127.             defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
  128.             defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  
  129.               
  130.             String pinyingStr="";  
  131.             try {  
  132.                 pinyingStr=PinyinHelper.toHanyuPinyinString(hanzi, defaultFormat, separator);  
  133.             } catch (BadHanyuPinyinOutputFormatCombination e) {  
  134.                 // TODO Auto-generated catch block  
  135.                 e.printStackTrace();  
  136.             }     
  137.             return pinyingStr;  
  138.     }  
  139.     /**  
  140.      * 将字符串数组转换成字符串  
  141.      * @param str   
  142.      * @param separator 各个字符串之间的分隔符  
  143.      * @return  
  144.      */  
  145.     public static String stringArrayToString(String[] str, String separator) {  
  146.         StringBuffer sb = new StringBuffer();  
  147.         for (int i = 0; i < str.length; i++) {  
  148.             sb.append(str[i]);  
  149.             if (str.length != (i + 1)) {  
  150.                 sb.append(separator);  
  151.             }  
  152.         }  
  153.         return sb.toString();  
  154.     }  
  155.     /**  
  156.      * 简单的将各个字符数组之间连接起来  
  157.      * @param str  
  158.      * @return  
  159.      */  
  160.     public  static String stringArrayToString(String[] str){  
  161.         return stringArrayToString(str,"");  
  162.     }  
  163.     /**  
  164.      * 将字符数组转换成字符串  
  165.      * @param str   
  166.      * @param separator 各个字符串之间的分隔符  
  167.      * @return  
  168.      */  
  169.     public static String charArrayToString(char[] ch, String separator) {  
  170.         StringBuffer sb = new StringBuffer();  
  171.         for (int i = 0; i < ch.length; i++) {  
  172.             sb.append(ch[i]);  
  173.             if (ch.length != (i + 1)) {  
  174.                 sb.append(separator);  
  175.             }  
  176.         }  
  177.         return sb.toString();  
  178.     }  
  179.       
  180.     /**  
  181.      * 将字符数组转换成字符串  
  182.      * @param str   
  183.      * @return  
  184.      */  
  185.     public static String charArrayToString(char[] ch) {  
  186.         return charArrayToString(ch," ");  
  187.     }  
  188.   
  189.     /**  
  190.      * 取汉字的首字母  
  191.      * @param src  
  192.      * @param isCapital 是否是大写  
  193.      * @return  
  194.      */  
  195.     public static char[]  getHeadByChar(char src,boolean isCapital){  
  196.         //如果不是汉字直接返回  
  197.         if (src <= 128) {  
  198.             return new char[]{src};  
  199.         }  
  200.         //获取所有的拼音  
  201.         String []pinyingStr=PinyinHelper.toHanyuPinyinStringArray(src);  
  202.           
  203.         //创建返回对象  
  204.         int polyphoneSize=pinyingStr.length;  
  205.         char [] headChars=new char[polyphoneSize];  
  206.         int i=0;  
  207.         //截取首字符  
  208.         for(String s:pinyingStr){  
  209.             char headChar=s.charAt(0);  
  210.             //首字母是否大写,默认是小写  
  211.             if(isCapital){  
  212.                 headChars[i]=Character.toUpperCase(headChar);  
  213.              }else{  
  214.                 headChars[i]=headChar;  
  215.              }  
  216.             i++;  
  217.         }  
  218.           
  219.         return headChars;  
  220.     }  
  221.     /**  
  222.      * 取汉字的首字母(默认是大写)  
  223.      * @param src  
  224.      * @return  
  225.      */  
  226.     public static char[]  getHeadByChar(char src){  
  227.         return getHeadByChar(src,true);  
  228.     }  
  229.     /**  
  230.      * 查找字符串首字母  
  231.      * @param src   
  232.      * @return  
  233.      */  
  234.     public  static String[] getHeadByString(String src){  
  235.         return getHeadByString( src, true);  
  236.     }  
  237.     /**  
  238.      * 查找字符串首字母  
  239.      * @param src   
  240.      * @param isCapital 是否大写  
  241.      * @return  
  242.      */  
  243.     public  static String[] getHeadByString(String src,boolean isCapital){  
  244.         return getHeadByString( src, isCapital,null);  
  245.     }  
  246.     /**  
  247.      * 查找字符串首字母  
  248.      * @param src   
  249.      * @param isCapital 是否大写  
  250.      * @param separator 分隔符  
  251.      * @return  
  252.      */  
  253.     public  static String[] getHeadByString(String src,boolean isCapital,String separator){  
  254.         char[]chars=src.toCharArray();  
  255.         String[] headString=new String[chars.length];  
  256.         int i=0;  
  257.         for(char ch:chars){  
  258.               
  259.             char[]chs=getHeadByChar(ch,isCapital);  
  260.             StringBuffer sb=new StringBuffer();  
  261.             if(null!=separator){  
  262.                 int j=1;  
  263.                   
  264.                 for(char ch1:chs){  
  265.                     sb.append(ch1);  
  266.                     if(j!=chs.length){  
  267.                         sb.append(separator);  
  268.                     }  
  269.                     j++;  
  270.                 }  
  271.             }else{  
  272.                 sb.append(chs[0]);  
  273.             }  
  274.             headString[i]=sb.toString();  
  275.             i++;  
  276.         }  
  277.         return headString;  
  278.     }  
  279.       
  280.     public static void main(String[] args) {  
  281.         System.out.println(PinyinUtil.stringArrayToString(getHeadByString("我的心肝爱上"),"-"));  
  282.           
  283.     }  
  284.   
  285. }  

 

上面这个pinyinUtil类是pinyin4j包中的一个工具类,有多种方法供大家使用。

 

User类,相信不用再贴出来了,大家懂的。。。

 

下面这个类是实现排序的类了。

 

Java代码   收藏代码
  1. package test;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collections;  
  5. import java.util.Comparator;  
  6. import java.util.List;  
  7.   
  8. public class HanZiSort {  
  9.   public static void main(String[] args) {  
  10.     List<User> list=new ArrayList<User>();  
  11.     User u=new User();  
  12.     u.setName("张三");  
  13.     u.setAge(21);  
  14.     list.add(u);  
  15.       
  16.     u=new User();  
  17.     u.setName("李四");  
  18.     u.setAge(18);  
  19.     list.add(u);  
  20.       
  21.     u=new User();  
  22.     u.setName("王五");  
  23.     u.setAge(25);  
  24.     list.add(u);  
  25.       
  26.     u=new User();  
  27.     u.setName("寒子");  
  28.     u.setAge(89);  
  29.     list.add(u);  
  30.       
  31.     for(User user: list) {  
  32.       System.out.println(PinyinUtil.hanziToPinyin(user.getName()));  
  33.     }  
  34.     Collections.sort(list, new ToSort());//new ToSort() 根据需求定义排序  
  35.     System.out.println("排序后!!!!!!!!!");  
  36.     for(User user: list) {  
  37.       System.out.println(PinyinUtil.hanziToPinyin(user.getName()));  
  38.     }  
  39.   }  
  40. }  
  41. //排序  
  42. class ToSort implements Comparator<User> {  
  43.   @Override  
  44.   public int compare(User o1, User o2) {  
  45.     // TODO Auto-generated method stub  
  46.     String s1=PinyinUtil.hanziToPinyin(o1.getName());  
  47.     String s2=PinyinUtil.hanziToPinyin(o2.getName());  
  48.     if(s1.compareTo(s2)>0) {  
  49.       return 1;  
  50.     } else {  
  51.       return -1;  
  52.     }  
  53.   }  
  54. }  
 

结果:

Java代码   收藏代码
  1. zhang san  
  2. li si  
  3. wang wu  
  4. han zi  
  5. 排序后!!!!!!!!!  
  6. han zi  
  7. li si  
  8. wang wu  
  9. zhang san  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pinyin4j是一个Java库,用于将中文字符换为拼音,并提供了一些方便的方法,如自然排序汉字拼音等功能。下面对pinyin4j的源码进行简单的浅析,并介绍如何使用pinyin4j对中文字符进行自然排序pinyin4j的主要类是PinyinHelper,它提供了将汉字换为拼音的方法。PinyinHelper类包含了以下方法: 1. public static String[] toHanyuPinyinStringArray(char c):将字符c换为拼音数组。 2. public static String[] toHanyuPinyinStringArray(char c, HanyuPinyinOutputFormat outputFormat):将字符c换为拼音数组,并指定输出格式。 3. public static String[] toHanyuPinyinStringArray(String str):将字符串str换为拼音数组。 4. public static String[] toHanyuPinyinStringArray(String str, HanyuPinyinOutputFormat outputFormat):将字符串str换为拼音数组,并指定输出格式。 其中HanyuPinyinOutputFormat为拼音输出格式,包含了拼音的大小写、声调等信息。 除了PinyinHelper类外,pinyin4j还提供了一个Collator类,用于对中文字符进行自然排序。Collator类的使用方法如下: 1. 创建一个Collator对象:Collator collator = Collator.getInstance(Locale.CHINA); 2. 使用Collator对象进行排序:Arrays.sort(array, collator); 其中array为需要排序的数组,collator为用于排序的Collator对象。 下面是使用pinyin4j对中文字符进行自然排序的示例代码: ``` import java.util.Arrays; import java.util.Locale; 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; import net.sourceforge.pinyin4j.PinyinHelper; import java.text.Collator; public class ChineseSort { public static void main(String[] args) throws BadHanyuPinyinOutputFormatCombination { String[] array = new String[]{"张三", "李四", "王五", "赵六", "田七"}; // 创建一个输出格式对象,指定拼音大小写、声调等信息 HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat(); outputFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE); outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); outputFormat.setVCharType(null); // 使用PinyinHelper类将中文换为拼音 for (int i = 0; i < array.length; i++) { StringBuilder sb = new StringBuilder(); for (char c : array[i].toCharArray()) { if (Character.toString(c).matches("[\\u4E00-\\u9FA5]+")) { String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, outputFormat); sb.append(pinyinArray[0]); } else { sb.append(Character.toString(c)); } } array[i] = sb.toString(); } // 创建一个Collator对象,用于对中文字符进行自然排序 Collator collator = Collator.getInstance(Locale.CHINA); // 使用Collator对象进行排序 Arrays.sort(array, collator); // 输出结果 for (String s : array) { System.out.println(s); } } } ``` 运行以上代码,输出结果为: ``` LISI TIANQI WANGWU ZHANSHAN ZHAOLIU ``` 可以看到,中文字符已经被换为了对应的拼音,并且按照拼音的顺序进行了排序。 总之,pinyin4j是一个非常实用的Java库,可以方便地将中文字符换为拼音,并提供了一些方便的方法,如自然排序汉字拼音等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值