最近CMS系统为了增加查询的匹配率,需要增加拼音检索字段,在网上找到了pinyin4j的java开源类库,提供中文转汉语拼音(并且支持多音字),呵呵,看了看他的demo,决定就用它了,因为我在实际使用的时候,需要考虑多音字的不同排列组合,下面的代码就是支持多音字的.
pinyin4j官方网址:http://pinyin4j.sourceforge.net/
控制台输出:dantianfang,shantianfang,chantianfang
pinyin4j官方网址:http://pinyin4j.sourceforge.net/
- importjava.util.HashSet;
- importjava.util.Set;
- importnet.sourceforge.pinyin4j.PinyinHelper;
- importnet.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
- importnet.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
- importnet.sourceforge.pinyin4j.format.HanyuPinyinToneType;
- importnet.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
- importnet.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
- publicclasspinyin4j{
- /**
- *字符串集合转换字符串(逗号分隔)
- *@authorwyh
- *@paramstringSet
- *@return
- */
- publicstaticStringmakeStringByStringSet(Set<String>stringSet){
- StringBuilderstr=newStringBuilder();
- inti=0;
- for(Strings:stringSet){
- if(i==stringSet.size()-1){
- str.append(s);
- }else{
- str.append(s+",");
- }
- i++;
- }
- returnstr.toString().toLowerCase();
- }
- /**
- *获取拼音集合
- *@authorwyh
- *@paramsrc
- *@returnSet<String>
- */
- publicstaticSet<String>getPinyin(Stringsrc){
- if(src!=null&&!src.trim().equalsIgnoreCase("")){
- char[]srcChar;
- srcChar=src.toCharArray();
- //汉语拼音格式输出类
- HanyuPinyinOutputFormathanYuPinOutputFormat=newHanyuPinyinOutputFormat();
- //输出设置,大小写,音标方式等
- hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
- hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE)
- hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
- String[][]temp=newString[src.length()][];
- for(inti=0;i<srcChar.length;i++){
- charc=srcChar[i];
- //是中文或者a-z或者A-Z转换拼音(我的需求,是保留中文或者a-z或者A-Z)
- if(String.valueOf(c).matches("[\\u4E00-\\u9FA5]+")){
- try{
- temp[i]=PinyinHelper.toHanyuPinyinStringArray(srcChar[i],hanYuPinOutputFormat);
- }catch(BadHanyuPinyinOutputFormatCombinatione){
- e.printStackTrace();
- }
- }elseif(((int)c>=65&&(int)c<=90)||((int)c>=97&&(int)c<=122)){
- temp[i]=newString[]{String.valueOf(srcChar[i])};
- }else{
- temp[i]=newString[]{""};
- }
- }
- String[]pingyinArray=Exchange(temp);
- Set<String>pinyinSet=newHashSet<String>();
- for(inti=0;i<pingyinArray.length;i++){
- pinyinSet.add(pingyinArray[i]);
- }
- returnpinyinSet;
- }
- returnnull;
- }
- /**
- *递归
- *@authorwyh
- *@paramstrJaggedArray
- *@return
- */
- publicstaticString[]Exchange(String[][]strJaggedArray){
- String[][]temp=DoExchange(strJaggedArray);
- returntemp[0];
- }
- /**
- *递归
- *@authorwyh
- *@paramstrJaggedArray
- *@return
- */
- privatestaticString[][]DoExchange(String[][]strJaggedArray){
- intlen=strJaggedArray.length;
- if(len>=2){
- intlen1=strJaggedArray[0].length;
- intlen2=strJaggedArray[1].length;
- intnewlen=len1*len2;
- String[]temp=newString[newlen];
- intIndex=0;
- for(inti=0;i<len1;i++){
- for(intj=0;j<len2;j++){
- temp[Index]=strJaggedArray[0][i]+strJaggedArray[1][j];
- Index++;
- }
- }
- String[][]newArray=newString[len-1][];
- for(inti=2;i<len;i++){
- newArray[i-1]=strJaggedArray[i];
- }
- newArray[0]=temp;
- returnDoExchange(newArray);
- }else{
- returnstrJaggedArray;
- }
- }
- /**
- *@paramargs
- */
- publicstaticvoidmain(String[]args){
- Stringstr="单田芳";
- System.out.println(makeStringByStringSet(getPinyin(str)));
- }
- }
控制台输出:dantianfang,shantianfang,chantianfang