·需求:
由于需要实现模糊搜索用户功能,其中需要把各种类型(全中文,全英文,中英混合等)的名称,都转化为英文(拼音)方便匹配。
如
“欧阳永叔叔”、“欧yangYong叔叔”、“ou阳永叔shu”、“@欧,yang|yong叔(叔)” -> [ou, yang, yong, shu, shu]
“Jack马”-> [jack, ma]
“Taylor·J·张” -> [taylor, j, zhang]
·难点
中英混合名称的转化
·代码实现:
public static List<String> getFullName(String name) { List<String> list = new ArrayList<>(); char[] names = name.toCharArray(); StringBuilder sb = new StringBuilder(); int index = 0; for (int i = 0; i < names.length; i++) { String pinYin = PinyinHelper.getPinYin(names[i]); //如果为null,说明该字符不是汉字 if (pinYin != null) { if (!TextUtils.isEmpty(sb)) { list.add(sb.toString()); } sb.delete(0, sb.length()); list.add(pinYin); index = i + 1; } else if (Character.toString(names[i]).matches("[a-z]")) { if (index == i) { sb.delete(0, sb.length()); } sb.append(names[i]); if (i == names.length - 1) { list.add(sb.toString()); } } else if (Character.toString(names[i]).matches("[A-Z]")) { if (!TextUtils.isEmpty(sb)) { list.add(sb.toString()); } sb.delete(0, sb.length()); sb.append(Character.toString(names[i]).toLowerCase()); } else { index = i + 1; } } return list; }
·注意:
类似“欧yangyong叔叔”、“欧Yangyong叔叔”会被转化为[ou, yangyong, shu, shu]
——0519添加
如果需要把数字也算做一种有效字符的实现方式
public static List<String> getFullName(String name) { List<String> lsit = new ArrayList<>(); char[] names = name.toCharArray(); StringBuilder sb = new StringBuilder(); //用于记录某个子项的第一个字符在name中的索引 int index = 0; for (int i = 0; i < names.length; i++) { String pinYin = PinyinHelper.getPinYin(names[i]); //如果不为null,说明该字符是汉字 if (pinYin != null) { if (!TextUtils.isEmpty(sb)) { list.add(sb.toString()); } sb.delete(0, sb.length()); list.add(Character.toString(names[i])); index = i + 1; } else if (Character.toString(names[i]).matches("[a-z]")) { if (index == i) { sb.delete(0, sb.length()); } sb.append(names[i]); if (i >= names.length - 1) { list.add(sb.toString()); } else if (48 <= names[i + 1] && names[i + 1] <= 57) { index = i + 1; } } else if (Character.toString(names[i]).matches("[A-Z]")) { if (!TextUtils.isEmpty(sb)) { list.add(sb.toString()); } sb.delete(0, sb.length()); sb.append(Character.toString(names[i]).toLowerCase()); if (i < names.length - 1 && 48 <= names[i + 1] && names[i + 1] <= 57) { index = i + 1; } } else if (Character.toString(names[i]).matches("\\d")) { if (index == i) { if (!TextUtils.isEmpty(sb)) { list.add(sb.toString()); } sb.delete(0, sb.length()); } sb.append(names[i]); if (i >= names.length - 1) { list.add(sb.toString()); } else if (!Character.toString(names[i + 1]).matches("\\d")) { index = i + 1; } } else { index = i + 1; } } return list; }
浙公网安备 33010602011771号