目标:词组汉字转拼音首字母组合 (包含多音字)
pinyin4j 有些汉字是多音字会生成多个拼音,首先需要去重;取首字母;然后取组合
一个词组里面建议不要有超过20个多音字;最好多音字5个左右;
如果多音字过多,会产生 翻倍 集合,导致内存泄漏;
如果多音字过多,建议把集合里面的 String 换成 StringBuilder;以后有时间在优化
/**
* 汉字转换位汉语拼音首字母
* 英文字符不变,特殊字符丢失 支持多音字
* 生成方式如(长沙市长:cssc,zssz,zssc,cssz)
*/
public static String converterToFirstSpell(String chines) throws Exception {
if (StringUtils.isBlank(chines)) {
return null;
}
// 打散字符串
char[] ziCharArray = chines.toCharArray();
// 拼音集合
List<List<String>> list = new ArrayList<List<String>>();
for (int i = 0; i < ziCharArray.length; i++) {
// 128 ASCII码 可见字符
char c = ziCharArray[i];
if (c > 128) {
List<String> result = duoYinZi(c);
list.add(result);
} else {
List<String> result = new ArrayList<String>();
result.add(String.valueOf(ziCharArray[i]));
list.add(result);
}
}
String result = parseTheChineseByObject(list);
return result;
}
private static String parseTheChineseByObject(List<List<String>> list) {
Set<String> result = new HashSet<String>();
if (CollectionUtils.isNotEmpty(list)) {
result.addAll(list.get(0));
}
for (int i = 1; i < list.size(); i++) {
Set<String> compositePYTemp = new HashSet<String>();
for (String pinyinFast : result) {
for (String c : list.get(i)) {
String str = pinyinFast + c;
compositePYTemp.add(str);
}
}
result = compositePYTemp;
}
StringBuilder sb = new StringBuilder();
if (CollectionUtils.isNotEmpty(result)) {
for (String str : result) {
sb.append(str).append(",");
}
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
public static List<String> duoYinZi(char zi) throws Exception {
List<String> pinyinName = new ArrayList<String>();
HanyuPinyinOutputFormat config = new HanyuPinyinOutputFormat();
// 小写
config.setCaseType(HanyuPinyinCaseType.LOWERCASE);
// 没有音调数字
config.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
// 取得当前汉字的所有全拼
String[] pyArray = PinyinHelper.toHanyuPinyinStringArray(zi, config);
if (pyArray != null && pyArray.length > 0) {
for (int pyIndex = 0; pyIndex < pyArray.length; pyIndex++) {
// 取首字母
char fast = pyArray[pyIndex].charAt(0);
int index = pinyinName.indexOf(String.valueOf(fast));
if (index < 0) {
pinyinName.add(String.valueOf(fast));
}
}
}
return pinyinName;
}
@Test
public void test12() throws Exception {
String str = "长沙市长";
String t = Pinyin4jUtil.converterToFirstSpell(str);
System.out.println("--->"+t);
}
// 结果
--->zssc,cssz,zssz,cssc
参考文档:http://doc123.top/