当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

pinyin4j的使用代码实例

发表于: 2013-04-20   作者:商人shang   来源:转载   浏览:
摘要: 这是自己根据文档加上网上搜的部分资料写出来的一个pinyin4j使用的实例,主要是为了实现根据拼音以及拼音简写检索姓名使用的,拿出来大家看看哪里有bug,希望指正,好改进我写的这个工具类。     package cn.zh.common; import java.util.ArrayList; import java.util.HashSet; import

这是自己根据文档加上网上搜的部分资料写出来的一个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商建国"));
	}
	
}

 

pinyin4j的使用代码实例

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
一、什么是pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以
综合应用小工具,汉字转拼音组件pinyin4j实例。(程序员收藏以备后用) package com.xcu.util; impo
pinyin4j是一个支持将简体和繁体中文转换到成拼音的Java开源类库,作者是Li Min (xmlerlimin@gmail.
今天开始学习java中的多线程,在看书的过程中写了一个实例来练习多线程的用法,下面把代码放到博文
跟想象的一样,iOS 8中的指纹识别使用起来还是很方便的,只需要一个接口就能搞定,屏幕上弹出一个模
Pinyin4j入门教程 pinyin4j是一个支持将简体和繁体中文转换到成拼音的Java开源类库,作者是Li Min (
我想如果要来生成代码,那么一定要使用一种模板的方式来进行生成,这样的代码可维护性高,代码的规
代码下载地址:http://www.zuidaima.com/share/1835085544524800.htm 原文:java正则表达式语法详解
今天看了一篇博客(http://guyexin-126-com.iteye.com/blog/842954)里说关于pinyin4j的即将汉字转
今天看了一篇博客(http://guyexin-126-com.iteye.com/blog/842954)里说关于pinyin4j的即将汉字转
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号