1. 程式人生 > >pinyin4j 生成 首字母片語組合 多音字片語組合

pinyin4j 生成 首字母片語組合 多音字片語組合

目標:片語漢字轉拼音首字母組合 (包含多音字)

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