设为首页收藏本站
开启辅助访问
切换到宽版

创星网络[分享知识 传递快乐]

 找回密码
 立即注册

QQ登录

只需一步,快速开始

用新浪微博登录

只需一步,快速搞定

搜索
查看: 3931|回复: 0
打印 上一主题 下一主题

java开源类库pinyin4j的使用

[复制链接]

我玩的应用:

跳转到指定楼层
楼主
发表于 2012-12-12 22:27:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近CMS系统为了增加查询的匹配率,需要增加拼音检索字段,在网上找到了pinyin4j的java开源类库,提供中文转汉语拼音(并且支持多音字),呵呵,看了看他的demo,决定就用它了,因为我在实际使用的时候,需要考虑多音字的不同排列组合,下面的代码就是支持多音字的.

pinyin4j官方网址:http://pinyin4j.sourceforge.net/
  1. import java.util.HashSet;
  2. import java.util.Set;

  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.HanyuPinyinVCharType;
  8. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

  9. public class pinyin4j {

  10. /**
  11.   * 字符串集合转换字符串(逗号分隔)
  12.   * @author wyh
  13.   * @param stringSet
  14.   * @return
  15.   */
  16. public static String makeStringByStringSet(Set<String> stringSet){
  17.   StringBuilder str = new StringBuilder();
  18.   int i=0;
  19.   for(String s : stringSet){
  20.    if(i == stringSet.size() - 1){
  21.     str.append(s);
  22.    }else{
  23.     str.append(s + ",");
  24.    }
  25.    i++;
  26.   }
  27.   return str.toString().toLowerCase();
  28. }

  29. /**
  30.   * 获取拼音集合
  31.   * @author wyh
  32.   * @param src
  33.   * @return Set<String>
  34.   */
  35. public static Set<String> getPinyin(String src){
  36.   if(src!=null && !src.trim().equalsIgnoreCase("")){
  37.    char[] srcChar ;
  38.    srcChar=src.toCharArray();
  39.    //汉语拼音格式输出类
  40.    HanyuPinyinOutputFormat hanYuPinOutputFormat = new HanyuPinyinOutputFormat();

  41. //输出设置,大小写,音标方式等
  42.    hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
  43.    hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE)
  44.    hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
  45.    
  46.    String[][] temp = new String[src.length()][];
  47.    for(int i=0;i<srcChar.length;i++){
  48.     char c = srcChar[i];
  49.     //是中文或者a-z或者A-Z转换拼音(我的需求,是保留中文或者a-z或者A-Z)
  50.     if(String.valueOf(c).matches("[\\u4E00-\\u9FA5]+")){
  51.      try{
  52.       temp[i] = PinyinHelper.toHanyuPinyinStringArray(srcChar[i], hanYuPinOutputFormat);
  53.      }catch(BadHanyuPinyinOutputFormatCombination e) {
  54.       e.printStackTrace();
  55.      }
  56.     }else if(((int)c>=65 && (int)c<=90) || ((int)c>=97 && (int)c<=122)){
  57.      temp[i] = new String[]{String.valueOf(srcChar[i])};
  58.     }else{
  59.      temp[i] = new String[]{""};
  60.     }
  61.    }
  62.    String[] pingyinArray = Exchange(temp);
  63.    Set<String> pinyinSet = new HashSet<String>();
  64.    for(int i=0;i<pingyinArray.length;i++){
  65.     pinyinSet.add(pingyinArray[i]);
  66.    }
  67.    return pinyinSet;
  68.   }
  69.   return null;
  70. }

  71. /**
  72.   * 递归
  73.   * @author wyh
  74.   * @param strJaggedArray
  75.   * @return
  76.   */
  77.     public static String[] Exchange(String[][] strJaggedArray){
  78.         String[][] temp = DoExchange(strJaggedArray);
  79.         return temp[0];      
  80.     }
  81.    
  82.     /**
  83.      * 递归
  84.      * @author wyh
  85.      * @param strJaggedArray
  86.      * @return
  87.      */
  88.     private static String[][] DoExchange(String[][] strJaggedArray){
  89.         int len = strJaggedArray.length;
  90.         if(len >= 2){           
  91.             int len1 = strJaggedArray[0].length;
  92.             int len2 = strJaggedArray[1].length;
  93.             int newlen = len1*len2;
  94.             String[] temp = new String[newlen];
  95.             int Index = 0;
  96.             for(int i=0;i<len1;i++){
  97.                 for(int j=0;j<len2;j++){
  98.                     temp[Index] = strJaggedArray[0][i] + strJaggedArray[1][j];
  99.                     Index ++;
  100.                 }
  101.             }
  102.             String[][] newArray = new String[len-1][];
  103.             for(int i=2;i<len;i++){
  104.                 newArray[i-1] = strJaggedArray[i];                           
  105.             }
  106.             newArray[0] = temp;
  107.             return DoExchange(newArray);
  108.         }else{
  109.          return strJaggedArray;   
  110.         }
  111.     }
  112.    
  113. /**
  114.   * @param args
  115.   */
  116. public static void main(String[] args) {
  117.   String str = "单田芳";
  118.   System.out.println(makeStringByStringSet(getPinyin(str)));

  119. }

  120. }
复制代码
控制台输出:dantianfang,shantianfang,chantianfang  

from:http://go.cxweb.com.cn/0ex2h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|创星网络 ( 苏ICP备11027519号|网站地图  

GMT+8, 2024-9-22 07:32 , Processed in 0.075614 second(s), 24 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表