JAVA面向对象编程艺术与思想:中文转拼音2

我现在用面向对象的思想来实现名字的转换





把名字中每个字都看成一个对象,建立类PinyinChar

该类包括字和拼音对象属性





package org.lrf.pinyin;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * 单个汉字,属性包括拼音
 * @author 33css.com
 *
 */
public class PinyinChar{

	/**
	 *  把单个汉字转成拼音
	 * @param content 单个汉字
	 * @param format 格式
	 */
	public PinyinChar(char content, HanyuPinyinOutputFormat format) {
		this.content = content;
		setPinyin(this.content, format);
	}

	private final char content; 
	private String pinyin;

	public String getPinyin() {
		return pinyin;
	}

	/**
	 * 把传入的汉字变成拼音
	 * @param content 汉字内容
	 * @param format 拼音格式
	 * @return
	 */
	private void setPinyin(char content, HanyuPinyinOutputFormat format) {
		if ((int) content <= 128) {//如果小于128 说明不是中文汉字 则直接返回
			pinyin = String.valueOf(content);
		} else {
			try {
				pinyin = PinyinHelper.toHanyuPinyinStringArray(content, format)[0];//toHanyuPinyinStringArray多音字 会获取到数组 使用第一个字
			} catch (BadHanyuPinyinOutputFormatCombination e) {
				e.printStackTrace();
			}
		}
	}
	
	@Override
	public String toString() {
		return this.pinyin;
	}
}



创建一个NameHandler,用于创建,管理,排序每一个pinyinChar集合,重写toSring方法以便调用者输出


package org.lrf.pinyin;

import java.util.ArrayList;
import java.util.List;

import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

public class NameHandler {
	
	public NameHandler(String name) {
		this.name = name;
		addPinYinNameToList();
	}
	
	private List<PinyinChar> pinyinChars;
	private String name;
	
	/** 
     * 将名字转换成拼音 
     *  
     * @throws BadHanyuPinyinOutputFormatCombination 
     */  
    private void addPinYinNameToList()  {  
        pinyinChars = new ArrayList<>();
        
        StringBuffer result = new StringBuffer();  
        for (int i = 0; i < name.length(); i++) {  
        		PinyinChar pinyinChar = new PinyinChar(name.charAt(i), createFormat());  
        		pinyinChars.add(pinyinChar);
        }  
        
        sortPinyinChars();//把名字放到姓的前面 
    }  
    
    /** 
     * 把名字放到姓的前面  
     */  
    private void sortPinyinChars() {  
    		pinyinChars.add(pinyinChars.get(0));
    		pinyinChars.remove(0);
    } 
    
    /** 
     * 创建样式 
     * @return 
     */  
    public static HanyuPinyinOutputFormat createFormat() {  
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();  
        format.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  
        return format;  
    }  
    
    /**
     * 拼接list中每个拼音
     */
    @Override
    public String toString() {
    		StringBuffer result = new StringBuffer();
    		for (PinyinChar pinyinChar : pinyinChars) {
    			result.append(pinyinChar.toString()).append(" ");
		}
    		return result.toString();
    }
}

入口方法

package org.lrf.pinyin;

public class Test {

	public static void main(String[] args) {
		System.out.println(new NameHandler("罗若峰").toString());
	}

}

面向对象很美,我爱面向对象

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值