·需求:

由于需要实现模糊搜索用户功能,其中需要把各种类型(全中文,全英文,中英混合等)的名称,都转化为英文(拼音)方便匹配。

“欧阳永叔叔”、“欧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;
    }

 

posted on 2023-05-16 11:51  我就像奶油  阅读(60)  评论(0)    收藏  举报