pinyin4j的使用代码实例 博客分类: 知识积累项目心得 pinyin4j汉字拼音姓名检索
程序员文章站
2024-03-11 13:29:07
...
这是自己根据文档加上网上搜的部分资料写出来的一个pinyin4j使用的实例,主要是为了实现根据拼音以及拼音简写检索姓名使用的,拿出来大家看看哪里有bug,希望指正,好改进我写的这个工具类。
package cn.zh.common; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; /** * * 类描述:操作汉字拼音的工具类 * <br />目前此版本只支持汉字,并且如果此串中包含非汉字,则会被丢弃,不做任何处理 * 类名称:PinyinTool * 创建人: sjg * 创建时间:2013-4-18 下午9:14:48 * @version 1.0 */ public class PinyinTool { /** * * 方法描述:根据输入的汉语获取拼音 * <br />其中,本方法输出的拼音包括全拼和简拼,并且全拼和简拼都不重复 * 方法名:getPinyin * 创建人:sjg * 创建时间:2013-4-18 下午9:16:47 * @param str 要进行转化的汉字字符串 * @return * 返回值:String */ public static String getPinyin(String str){ if (str == null || "".equals(str)) { return null; } List<Set<String>> pinyins = getPinyinStr(str); if (pinyins== null || pinyins.size()<1) { return null; } List<String> quanpin = getQuanpinResult(pinyins, null, 0);// 获取全拼 Set<String> jianpin = getJianpinResult(pinyins, null, 0);// 获取简拼 StringBuilder sb = new StringBuilder(); for(int i =0;i<quanpin.size();i++){ if (i != quanpin.size()-1) { sb.append(quanpin.get(i) + ","); }else { sb.append(quanpin.get(i)); } } Iterator<String> iterator = jianpin.iterator(); while (iterator.hasNext()) { sb.append("," + iterator.next()); } return sb.toString(); } /** * * 方法描述:获取首字母简拼 * <br />为了防止重复,所以,使用set * 方法名:getJianpinResult * 创建人:sjg * 创建时间:2013-4-18 下午9:10:47 * @param pinyins * @param curSet * @param index * @return * 返回值:Set<String> */ public static Set<String> getJianpinResult(List<Set<String>> pinyins, Set<String> curSet, int index){ if (pinyins == null || pinyins.size()<1) { return null; } Set<String> tempSet = new HashSet<String>(); Set<String> pinyinSet = pinyins.get(index); if (curSet == null) { curSet = new HashSet<String>(); for (String string : pinyinSet) { tempSet.add(string.charAt(0)+""); } }else { for (String oldPinyin : curSet) { for (String newPinyin : pinyinSet) { tempSet.add(oldPinyin + newPinyin.charAt(0)); } } } if (index == pinyins.size()-1) { return tempSet; }else { return getJianpinResult(pinyins, tempSet, ++index); } } /** * * 方法描述: 获取所有的全拼结果 * 方法名:getQuanpinResult * 创建人:sjg * 创建时间:2013-4-18 下午8:56:17 * @param pinyins * @param curList * @param index * @return * 返回值:List<String> */ public static List<String> getQuanpinResult(List<Set<String>> pinyins, List<String> curList, int index){ if (pinyins == null || pinyins.size()<1) { return null; } List<String> tempList = new ArrayList<String>(); Set<String> pinyinSet = pinyins.get(index); if (curList == null) { curList = new ArrayList<String>(); for (String string : pinyinSet) { tempList.add(string); } }else { for (String oldPinyin : curList) { for (String newPinyin : pinyinSet) { tempList.add(oldPinyin + newPinyin ); } } } if (index == pinyins.size()-1) { return tempList; }else { return getQuanpinResult(pinyins, tempList, ++index); } } /** * * 方法描述:获取这个字符串的所有的拼音的组合 * 方法名:getPinyinStr * 创建人:sjg * 创建时间:2013-4-18 下午5:22:27 * @param str * @return * 返回值:String */ public static List<Set<String>> getPinyinStr(String str){ if (str == null) { return null; } char[] chars = str.toCharArray(); List<Set<String>> pinyinList = new ArrayList<Set<String>>(); Set<String> pinyinsetSet = null; for (char c : chars) {// 获取所有的汉字的拼音 pinyinsetSet = getCharacterPins(c); if (pinyinsetSet != null) { pinyinList.add(pinyinsetSet); } } return pinyinList; } /** * * 方法描述:获取单个字符的拼音 * <br/>由于我的需求是不要声调,相同读音的拼音便不要重复出现了,所以,选择使用set * 方法名:getCharacterPins * 创建人:sjg * 创建时间:2013-4-18 下午5:07:52 * @param c * @return * 返回值:Set<String> */ public static Set<String> getCharacterPins(char c){ HanyuPinyinOutputFormat format = getFormat(); String[] pinyins = null; try { // 获取拼音 pinyins = PinyinHelper.toHanyuPinyinStringArray(c, format); } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } Set<String> pinyinset = null; // 发生异常或者字符不是拼音的时候,pins都有可能是null,所以,必须进行判断 if (pinyins != null) { pinyinset = new HashSet<String>(); for (String pinyin : pinyins) { pinyinset.add(pinyin); } } return pinyinset; } /** * * 方法描述:获取HanyuPinyinOutputFormat的实例 * 方法名:getFormat * 创建人:sjg * 创建时间:2013-4-18 下午5:06:11 * @return * 返回值:HanyuPinyinOutputFormat */ private static HanyuPinyinOutputFormat getFormat(){ HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); format.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 小写 format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 声调不要 format.setVCharType(HanyuPinyinVCharType.WITH_V); return format; } public static void main(String[] args) { System.out.println(getPinyin("aa商建国")); } }