zoukankan      html  css  js  c++  java
  • java开源类库pinyin4j的使用

    最近CMS系统为了增加查询的匹配率,需要增加拼音检索字段,在网上找到了pinyin4j的java开源类库,提供中文转汉语拼音(并且支持多音字), 呵呵,看了看他的demo,决定就用它了,因为我在实际使用的时候,需要考虑多音字的不同排列组合,下面的代码就是支持多音字的.

    pinyin4j官方网址:http://pinyin4j.sourceforge.net/

    Java代码  
      1. import java.util.HashSet;  
      2. import java.util.Set;  
      3.   
      4. import net.sourceforge.pinyin4j.PinyinHelper;  
      5. import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;  
      6. import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;  
      7. import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;  
      8. import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;  
      9. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;  
      10.   
      11. public class pinyin4j {  
      12.    
      13.  /** 
      14.   * 字符串集合转换字符串(逗号分隔) 
      15.   * @author wyh 
      16.   * @param stringSet 
      17.   * @return 
      18.   */  
      19.  public static String makeStringByStringSet(Set<String> stringSet){  
      20.   StringBuilder str = new StringBuilder();  
      21.   int i=0;  
      22.   for(String s : stringSet){  
      23.    if(i == stringSet.size() - 1){  
      24.     str.append(s);  
      25.    }else{  
      26.     str.append(s + ",");  
      27.    }  
      28.    i++;  
      29.   }  
      30.   return str.toString().toLowerCase();  
      31.  }  
      32.    
      33.  /** 
      34.   * 获取拼音集合 
      35.   * @author wyh 
      36.   * @param src 
      37.   * @return Set<String> 
      38.   */  
      39.  public static Set<String> getPinyin(String src){  
      40.   if(src!=null && !src.trim().equalsIgnoreCase("")){  
      41.    char[] srcChar ;  
      42.    srcChar=src.toCharArray();  
      43.    //汉语拼音格式输出类  
      44.    HanyuPinyinOutputFormat hanYuPinOutputFormat = new HanyuPinyinOutputFormat();  
      45.   
      46. //输出设置,大小写,音标方式等  
      47.    hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);   
      48.    hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE)  
      49.    hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);  
      50.      
      51.    String[][] temp = new String[src.length()][];  
      52.    for(int i=0;i<srcChar.length;i++){  
      53.     char c = srcChar[i];  
      54.     //是中文或者a-z或者A-Z转换拼音(我的需求,是保留中文或者a-z或者A-Z)  
      55.     if(String.valueOf(c).matches("[\u4E00-\u9FA5]+")){  
      56.      try{  
      57.       temp[i] = PinyinHelper.toHanyuPinyinStringArray(srcChar[i], hanYuPinOutputFormat);  
      58.      }catch(BadHanyuPinyinOutputFormatCombination e) {  
      59.       e.printStackTrace();  
      60.      }  
      61.     }else if(((int)c>=65 && (int)c<=90) || ((int)c>=97 && (int)c<=122)){  
      62.      temp[i] = new String[]{String.valueOf(srcChar[i])};  
      63.     }else{  
      64.      temp[i] = new String[]{""};  
      65.     }  
      66.    }  
      67.    String[] pingyinArray = Exchange(temp);  
      68.    Set<String> pinyinSet = new HashSet<String>();  
      69.    for(int i=0;i<pingyinArray.length;i++){  
      70.     pinyinSet.add(pingyinArray[i]);  
      71.    }  
      72.    return pinyinSet;  
      73.   }  
      74.   return null;  
      75.  }  
      76.    
      77.  /** 
      78.   * 递归 
      79.   * @author wyh 
      80.   * @param strJaggedArray 
      81.   * @return 
      82.   */  
      83.     public static String[] Exchange(String[][] strJaggedArray){  
      84.         String[][] temp = DoExchange(strJaggedArray);  
      85.         return temp[0];         
      86.     }  
      87.      
      88.     /** 
      89.      * 递归 
      90.      * @author wyh 
      91.      * @param strJaggedArray 
      92.      * @return 
      93.      */  
      94.     private static String[][] DoExchange(String[][] strJaggedArray){  
      95.         int len = strJaggedArray.length;  
      96.         if(len >= 2){             
      97.             int len1 = strJaggedArray[0].length;  
      98.             int len2 = strJaggedArray[1].length;  
      99.             int newlen = len1*len2;  
      100.             String[] temp = new String[newlen];  
      101.             int Index = 0;  
      102.             for(int i=0;i<len1;i++){  
      103.                 for(int j=0;j<len2;j++){  
      104.                     temp[Index] = strJaggedArray[0][i] + strJaggedArray[1][j];  
      105.                     Index ++;  
      106.                 }  
      107.             }  
      108.             String[][] newArray = new String[len-1][];  
      109.             for(int i=2;i<len;i++){  
      110.                 newArray[i-1] = strJaggedArray[i];                             
      111.             }  
      112.             newArray[0] = temp;  
      113.             return DoExchange(newArray);  
      114.         }else{  
      115.          return strJaggedArray;     
      116.         }  
      117.     }  
      118.      
      119.  /** 
      120.   * @param args 
      121.   */  
      122.  public static void main(String[] args) {  
      123.   String str = "单田芳";  
      124.   System.out.println(makeStringByStringSet(getPinyin(str)));  
      125.   
      126. }  
      127.   
      128. }
      129. 控制台输出:dantianfang,shantianfang,chantianfang
  • 相关阅读:
    Codeforces Round #344 (Div. 2) C. Report 其他
    Codeforces Round #344 (Div. 2) B. Print Check 水题
    Codeforces Round #344 (Div. 2) A. Interview 水题
    8VC Venture Cup 2016
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂
    CDOJ 1279 班委选举 每周一题 div2 暴力
    每周算法讲堂 快速幂
    8VC Venture Cup 2016
    Educational Codeforces Round 9 F. Magic Matrix 最小生成树
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3336581.html
Copyright © 2011-2022 走看看