我现在用面向对象的思想来实现名字的转换
把名字中每个字都看成一个对象,建立类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());
}
}
面向对象很美,我爱面向对象