最近工作中遇到姓名转拼音的需求,睿智的监工开始说只要实现姓名转拼音,做好之后又要求处理多音字,唉!
代码如下
首先是maven依赖
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>
创建姓名转拼音工具类
package com.xiaoa.utils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
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;
public class PinYinUtil {
private static final int ASCII_MIN_SIZE = 32;
private static final int ASCII_MAX_SIZE = 125;
public static String getPinyin(String word) {
HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
outputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
char[] charArray = word.toCharArray();
List<List<String>> lists = new ArrayList<>();
for (int i = 0; i < charArray.length; i++) {
List<String> asList = Arrays.asList(getPinyin(charArray[i]));
lists.add(asList);
}
StringBuilder sb = new StringBuilder();
try {
List<String> descartes = descartes(lists, 0, "", new ArrayList<>());
for (int j = 0; j < descartes.size(); j++) {
if (j != descartes.size() - 1) {
sb.append(descartes.get(j)).append(" ");
} else {
sb.append(descartes.get(j));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
private static List<String> descartes(List<List<String>> dimensionValues, int position, String originCode, List<String> result) {
List<String> rowValue = dimensionValues.get(position);
for (String code : rowValue) {
String resultCode = (position == 0) ? code : (originCode + "" + code);
if (position == dimensionValues.size() - 1) {
result.add(resultCode);
continue;
}
descartes(dimensionValues, position + 1, resultCode, result);
}
return result;
}
private PinYinUtil() {
throw new IllegalStateException("Utility class");
}
public static String[] getPinyin(char ch) {
try {
HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
outputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
if (ch >= ' ' && ch <= '}')
return new String[] { String.valueOf(ch) };
return distinct(PinyinHelper.toHanyuPinyinStringArray(ch, outputFormat));
} catch (BadHanyuPinyinOutputFormatCombination e) {
throw new IllegalStateException(e);
}
}
private static String[] distinct(String[] arr) {
if (arr == null || arr.length == 0)
return arr;
HashSet<String> set = new HashSet<>();
for (String str : arr)
set.add(str);
return (String[])set.toArray((Object[])new String[0]);
}
}
测试方法如下
package com.xiaoa.test;
import com.xiaoa.utils.PinYinUtil;
/**
* @BelongsProject: name2pinyin
* @BelongsPackage: com.xiaoa.utils.com.xiaoa
* @Author: crazy_data
* @CreateTime: 2022-11-15 14:26
* @Description: 测试姓名转拼音
* @Version: 1.0
*/
public class PinyinTest {
public static void main(String[] args) {
String pinyin = PinYinUtil.getPinyin("中国红");
System.out.println(pinyin);
}
}
测试结果如下