8 changed files with 245 additions and 15 deletions
@ -0,0 +1,210 @@ |
|||
package com.tduck.cloud.common.util; |
|||
|
|||
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; |
|||
|
|||
import java.util.HashMap; |
|||
import java.util.HashSet; |
|||
import java.util.Map; |
|||
import java.util.Set; |
|||
|
|||
|
|||
/** |
|||
* @author liujianjun |
|||
*/ |
|||
public class Pinyin4jUtil { |
|||
private static Map<Character,String[]> duoyinMap; |
|||
static { |
|||
duoyinMap = new HashMap<>(); |
|||
duoyinMap.put('区',new String[]{"qu"}); |
|||
duoyinMap.put('系',new String[]{"xi"}); |
|||
duoyinMap.put('率',new String[]{"lv"}); |
|||
duoyinMap.put('员',new String[]{"yuan"}); |
|||
duoyinMap.put('提',new String[]{"ti"}); |
|||
duoyinMap.put('被',new String[]{"bei"}); |
|||
duoyinMap.put('期',new String[]{"qi"}); |
|||
duoyinMap.put('参',new String[]{"can"}); |
|||
duoyinMap.put('均',new String[]{"jun"}); |
|||
duoyinMap.put('会', new String[]{"hui"}); |
|||
duoyinMap.put('属', new String[]{"shu"}); |
|||
duoyinMap.put('调', new String[]{"diao"}); |
|||
/** |
|||
* remark:todo 如果改动得确定库里没有 全量的重新生成的没有问题 |
|||
*/ |
|||
} |
|||
|
|||
/** |
|||
* getFirstSpellPinYin:(多音字的时候获取第一个). <br/> |
|||
* |
|||
* @param src 传入的拼音字符串,以逗号隔开 |
|||
* @param isFullSpell 是否全拼,true:全拼,false:第一个汉字全拼(其它汉字取首字母) |
|||
* @return 第一个拼音 |
|||
*/ |
|||
public static String getFirstSpellPinYin(String src, boolean isFullSpell) { |
|||
String targetStr = Pinyin4jUtil.makeStringByStringSet(Pinyin4jUtil.getPinyin(src, isFullSpell, 1)); |
|||
String[] split = targetStr.split(","); |
|||
if (split.length > 1) { |
|||
targetStr = split[0]; |
|||
} |
|||
return targetStr; |
|||
} |
|||
|
|||
/** |
|||
* getFirstSpellPinYin:(多音字的时候获取第一个). <br/> |
|||
* |
|||
* @param src 传入的拼音字符串,以逗号隔开 |
|||
* @param isFullSpell 是否全拼,true:全拼,false:第一个汉字全拼(其它汉字取首字母) |
|||
* @return 第一个拼音 |
|||
*/ |
|||
public static String getSpellPinYin(String src, boolean isFullSpell,Integer preFont) { |
|||
String targetStr = Pinyin4jUtil.makeStringByStringSet(Pinyin4jUtil.getPinyin(src, isFullSpell, preFont)); |
|||
String[] split = targetStr.split(","); |
|||
if (split.length > 1) { |
|||
targetStr = split[0]; |
|||
} |
|||
return targetStr; |
|||
} |
|||
|
|||
/** |
|||
* makeStringByStringSet:(拼音字符串集合转换字符串(逗号分隔)). <br/> |
|||
* |
|||
* @param stringSet 拼音集合 |
|||
* @return 带逗号字符串 |
|||
*/ |
|||
public static String makeStringByStringSet(Set<String> stringSet) { |
|||
StringBuilder str = new StringBuilder(); |
|||
int i = 0; |
|||
if (stringSet.size() > 0) { |
|||
for (String s : stringSet) { |
|||
if (i == stringSet.size() - 1) { |
|||
str.append(s); |
|||
} else { |
|||
str.append(s + ","); |
|||
} |
|||
i++; |
|||
} |
|||
} |
|||
return str.toString().toLowerCase(); |
|||
} |
|||
|
|||
/** |
|||
* getPinyin:(获取汉字拼音). <br/> |
|||
* |
|||
* @param src 汉字 |
|||
* @param isFullSpell 是否全拼,如果为true:全拼,false:首字全拼 |
|||
* @param preFont isFullSpell =true时,前几个字全拼 |
|||
* @return |
|||
*/ |
|||
public static Set<String> getPinyin(String src, boolean isFullSpell, int preFont) { |
|||
if (src != null && !src.trim().equalsIgnoreCase("")) { |
|||
char[] srcChar; |
|||
srcChar = src.toCharArray(); |
|||
// 汉语拼音格式输出类
|
|||
HanyuPinyinOutputFormat hanYuPinOutputFormat = new HanyuPinyinOutputFormat(); |
|||
|
|||
// 输出设置,大小写,音标方式等
|
|||
hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); |
|||
hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); |
|||
hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V); |
|||
|
|||
String[][] temp = new String[src.length()][]; |
|||
for (int i = 0; i < srcChar.length; i++) { |
|||
char c = srcChar[i]; |
|||
if (String.valueOf(c).matches("[\\u4E00-\\u9FA5]+")) {//中文
|
|||
try { |
|||
String[] py = duoyinMap.get(c); |
|||
if (py != null){ |
|||
temp[i] = py; |
|||
}else{ |
|||
temp[i] = PinyinHelper.toHanyuPinyinStringArray(srcChar[i], hanYuPinOutputFormat); |
|||
} |
|||
|
|||
if (!isFullSpell) { |
|||
if (i < preFont) { |
|||
temp[i] = temp[i]; |
|||
} else { |
|||
String[] tTemps = new String[temp[i].length]; |
|||
for (int j = 0; j < temp[i].length; j++) { |
|||
char t = temp[i][j].charAt(0); |
|||
tTemps[j] = Character.toString(t); |
|||
} |
|||
temp[i] = tTemps; |
|||
} |
|||
} |
|||
} catch (BadHanyuPinyinOutputFormatCombination e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} else if (((int) c >= 65 && (int) c <= 90) |
|||
|| ((int) c >= 97 && (int) c <= 122)) {//英文
|
|||
temp[i] = new String[]{String.valueOf(srcChar[i])}; |
|||
} else {//非汉字全盘返回即可
|
|||
temp[i] = new String[]{String.valueOf(srcChar[i])}; |
|||
} |
|||
} |
|||
String[] pingyinArray = exchange(temp); |
|||
Set<String> pinyinSet = new HashSet<String>(); |
|||
for (int i = 0; i < pingyinArray.length; i++) { |
|||
pinyinSet.add(pingyinArray[i]); |
|||
} |
|||
return pinyinSet; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
/** |
|||
* 递归 |
|||
* |
|||
* @param strJaggedArray |
|||
* @return |
|||
*/ |
|||
public static String[] exchange(String[][] strJaggedArray) { |
|||
String[][] temp = doExchange(strJaggedArray); |
|||
return temp[0]; |
|||
} |
|||
|
|||
/** |
|||
* 递归 |
|||
* |
|||
* @param strJaggedArray |
|||
* @return |
|||
*/ |
|||
private static String[][] doExchange(String[][] strJaggedArray) { |
|||
int len = strJaggedArray.length; |
|||
if (len >= 2) { |
|||
int len1 = strJaggedArray[0].length; |
|||
int len2 = strJaggedArray[1].length; |
|||
int newlen = len1 * len2; |
|||
String[] temp = new String[newlen]; |
|||
int Index = 0; |
|||
for (int i = 0; i < len1; i++) { |
|||
for (int j = 0; j < len2; j++) { |
|||
temp[Index] = strJaggedArray[0][i] + strJaggedArray[1][j]; |
|||
Index++; |
|||
} |
|||
} |
|||
String[][] newArray = new String[len - 1][]; |
|||
for (int i = 2; i < len; i++) { |
|||
newArray[i - 1] = strJaggedArray[i]; |
|||
} |
|||
newArray[0] = temp; |
|||
return doExchange(newArray); |
|||
} else { |
|||
return strJaggedArray; |
|||
} |
|||
} |
|||
|
|||
public static void main(String[] args) { |
|||
//System.out.println(getSpellPinYin("社区超期项目数",true,0));
|
|||
System.out.println(getFirstSpellPinYin("调料",true)); |
|||
System.out.println(getFirstSpellPinYin("调查",true)); |
|||
System.out.println(getFirstSpellPinYin("测试",true)); |
|||
System.out.println(getFirstSpellPinYin("满意度",true)); |
|||
System.out.println(getFirstSpellPinYin("其他",true)); |
|||
//System.out.println(getSpellPinYin("党员提出话题数",false,4));
|
|||
//System.out.println(getSpellPinYin("社区超期项目数",false,4));
|
|||
} |
|||
} |
Loading…
Reference in new issue