300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 拼音匹配汉字并将汉字高亮

拼音匹配汉字并将汉字高亮

时间:2018-11-03 18:55:23

相关推荐

拼音匹配汉字并将汉字高亮

先将汉字转拼音,用到pingyin4j工具类

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.exception.BadHanyuPinyinOutputFormatCombination;import java.util.Arrays;public class Pingyin4jUtils {/*** 将字符串转换成拼音数组** @param src* @return*/public static String[] stringToPinyin(String src) {return stringToPinyin(src, false, null);}/*** 将字符串转换成拼音数组** @param src* @return*/public static String[] stringToPinyin(String src, String separator) {return stringToPinyin(src, true, separator);}/*** 将字符串转换成拼音数组** @param src* @param isPolyphone* 是否查出多音字的所有拼音* @param separator* 多音字拼音之间的分隔符* @return*/public static String[] stringToPinyin(String src, boolean isPolyphone,String separator) {// 判断字符串是否为空if ("".equals(src) || null == src) {return null;}char[] srcChar = src.toCharArray();int srcCount = srcChar.length;String[] srcStr = new String[srcCount];for (int i = 0; i < srcCount; i++) {srcStr[i] = charToPinyin(srcChar[i], isPolyphone, separator);}return srcStr;}/*** 将单个字符转换成拼音** @param src* @return*/public static String charToPinyin(char src, boolean isPolyphone,String separator) {// 创建汉语拼音处理类HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();// 输出设置,大小写,音标方式defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);StringBuffer tempPinying = new StringBuffer();// 如果是中文if (src > 128) {try {// 转换得出结果String[] strs = PinyinHelper.toHanyuPinyinStringArray(src,defaultFormat);// 是否查出多音字,默认是查出多音字的第一个字符if (isPolyphone && null != separator) {for (int i = 0; i < strs.length; i++) {tempPinying.append(strs[i]);if (strs.length != (i + 1)) {// 多音字之间用特殊符号间隔起来tempPinying.append(separator);}}} else {tempPinying.append(strs[0]);}} catch (BadHanyuPinyinOutputFormatCombination e) {e.printStackTrace();}} else {tempPinying.append(src);}return tempPinying.toString();}public static String hanziToPinyin(String hanzi) {return hanziToPinyin(hanzi, " ");}/*** 将汉字转换成拼音** @param hanzi* @param separator* @return*/public static String hanziToPinyin(String hanzi, String separator) {// 创建汉语拼音处理类HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();// 输出设置,大小写,音标方式defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);String pinyingStr = "";try {pinyingStr = PinyinHelper.toHanyuPinyinString(hanzi, defaultFormat,separator);} catch (BadHanyuPinyinOutputFormatCombination e) {// TODO Auto-generated catch blocke.printStackTrace();}return pinyingStr;}/*** 将字符串数组转换成字符串** @param str* @param separator* 各个字符串之间的分隔符* @return*/public static String stringArrayToString(String[] str, String separator) {StringBuffer sb = new StringBuffer();for (int i = 0; i < str.length; i++) {sb.append(str[i]);if (str.length != (i + 1)) {sb.append(separator);}}return sb.toString();}/*** 简单的将各个字符数组之间连接起来** @param str* @return*/public static String stringArrayToString(String[] str) {return stringArrayToString(str, "");}/*** 将字符数组转换成字符串** @param ch* @param separator* 各个字符串之间的分隔符* @return*/public static String charArrayToString(char[] ch, String separator) {StringBuffer sb = new StringBuffer();for (int i = 0; i < ch.length; i++) {sb.append(ch[i]);if (ch.length != (i + 1)) {sb.append(separator);}}return sb.toString();}/*** 将字符数组转换成字符串** @param ch* @return*/public static String charArrayToString(char[] ch) {return charArrayToString(ch, " ");}/*** 取汉字的首字母** @param src* @param isCapital* 是否是大写* @return*/public static char[] getHeadByChar(char src, boolean isCapital) {// 如果不是汉字直接返回if (src <= 128) {return new char[] { src };}// 获取所有的拼音String[] pinyingStr = PinyinHelper.toHanyuPinyinStringArray(src);// 创建返回对象int polyphoneSize = pinyingStr.length;char[] headChars = new char[polyphoneSize];int i = 0;// 截取首字符for (String s : pinyingStr) {char headChar = s.charAt(0);// 首字母是否大写,默认是小写if (isCapital) {headChars[i] = Character.toUpperCase(headChar);} else {headChars[i] = headChar;}i++;}return headChars;}/*** 取汉字的首字母(默认是大写)** @param src* @return*/public static char[] getHeadByChar(char src) {return getHeadByChar(src, true);}/*** 查找字符串首字母** @param src* @return*/public static String[] getHeadByString(String src) {return getHeadByString(src, true);}/*** 查找字符串首字母** @param src* @param isCapital* 是否大写* @return*/public static String[] getHeadByString(String src, boolean isCapital) {return getHeadByString(src, isCapital, null);}/*** 查找字符串首字母** @param src* @param isCapital* 是否大写* @param separator* 分隔符* @return*/public static String[] getHeadByString(String src, boolean isCapital,String separator) {char[] chars = src.toCharArray();String[] headString = new String[chars.length];int i = 0;for (char ch : chars) {char[] chs = getHeadByChar(ch, isCapital);StringBuffer sb = new StringBuffer();if (null != separator) {int j = 1;for (char ch1 : chs) {sb.append(ch1);if (j != chs.length) {sb.append(separator);}j++;}} else {sb.append(chs[0]);}headString[i] = sb.toString();i++;}return headString;}public static void main(String[] args) {// pin4j 简码 和 城市编码String s1 = "中华人民共和国";String[] headArray = getHeadByString(s1); // 获得每个汉字拼音首字母System.out.println(Arrays.toString(headArray));String s2 ="长城" ;System.out.println(Arrays.toString(stringToPinyin(s2,true,",")));String s3 ="长";System.out.println(Arrays.toString(stringToPinyin(s3,true,",")));}}

匹配工具类主要涉及字符串拼接,拆分(匹配方法可以优化使用KMP模式匹配算法,有空优化。。。)

//Utils.java/*** Search for the corresponding Chinese characters.* @param name name* @param keyWord keyWord*/public static SpannableStringBuilder stringSearch(String name, String keyWord) {String[] pinyin = Pingyin4jUtils.stringToPinyin(name, true, "/");startIndex = -1;endIndex = -1;//flag判断是不是索引字符串的开头flag = true;SpannableStringBuilder builder = new SpannableStringBuilder();builder.append(name);StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < pinyin.length; i++) {stringBuilder = getPinyinItem(pinyin[i], keyWord, stringBuilder, i);//当字符串包含keyword时说明已找到,记录endindexif (stringBuilder.toString().contains(keyWord)) {endIndex = i ;if (startIndex == -1) {startIndex = i;}UILog.i(TAG, "startIndex = " + startIndex + "endIndex = " + endIndex);builder.setSpan(new ForegroundColorSpan(ThemeManager.get().getColor(mon_txt_red)), startIndex, endIndex+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);break;}}return builder;}/*** Traversing and splicing Chinese Pinyin.* @param pinyin pinyin* @param keyWord keyWord* @param stringBuilder stringBuilder* @param i i*/private static StringBuilder getPinyinItem(String pinyin, String keyWord, StringBuilder stringBuilder, int i) {//有/说明是多音字if (pinyin.contains("/")) {String[] pingitem = pinyin.split("/");UILog.i(TAG, "pingitem = "+ Arrays.toString(pingitem));StringBuilder temp = new StringBuilder();temp.append(stringBuilder);for (String s : pingitem) {//如果包含关键字则进行拼接,并记录位置if (keyWord.contains(s)||temp.append(s).toString().contains(keyWord)) {if (flag) {startIndex = i;flag = false;}stringBuilder.append(s);break;} else {flag = true;}}} else {if ((keyWord.contains(pinyin) || pinyin.contains(keyWord)) && flag) {startIndex = i;flag = false;} else if (!keyWord.contains(pinyin) && !pinyin.contains(keyWord)) {flag = true;}stringBuilder.append(pinyin);}return stringBuilder;}

使用方法:

SpannableStringBuilder builder = Utils.stringSearch(name, keyWord);mName.setText(builder);

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。