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
  • 相关阅读:
    解决“不是有效的win32应用程序”问题
    mysql 5.7 windows install
    Redis
    给 string 添加一个 GetInputStream 扩展方法
    定时任务为什么不用Timer
    怎样改动 VC6.0 4.0 2010 打印预览界面上的文字
    大数据时代的万象变化
    &lt;监听器模式&gt;在C++ 与 Java 之间实现的差异
    工厂模式之抽象工厂模式
    UIButton上字体的对齐方式
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3336581.html
Copyright © 2011-2022 走看看