中文汉字转拼音 工具类

  • Jar包
       <dependency>
                <groupId>com.belerweb</groupId>
                <artifactId>pinyin4j</artifactId>
                <version>2.5.0</version>
      </dependency>
  • 工具类代码

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 java.lang.reflect.Field;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 汉字转拼音
 *
 * @author Mr丶s
 * @date 2024/9/20 15:12
 * @description
 */
public class PinyinUtil {

    // 拼音格式化设置
    private static final HanyuPinyinOutputFormat FORMAT = new HanyuPinyinOutputFormat();

    static {
        // 设置拼音格式
        FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);         // 小写
        FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);      // 不要声调
        FORMAT.setVCharType(HanyuPinyinVCharType.WITH_V);          // 使用v表示ü
    }

    /**
     * 将集合按照指定字段的拼音顺序进行排序
     *
     * @param list      要排序的集合
     * @param fieldName 要排序的字段名称(字段类型为String,内容为中文)
     * @param <T>       集合中对象的类型
     * @return 排序后的集合
     */
    public static <T> List<T> sortByPinyin(List<T> list, String fieldName) {
        if (list == null || list.isEmpty()) {
            return list;
        }
        return list.stream()
                .sorted(Comparator.comparing(item -> getFieldPinyin(item, fieldName)))
                .collect(Collectors.toList());
    }

    /**
     * 在集合中根据指定字段进行中文或拼音的模糊搜索
     *
     * @param list      要搜索的集合
     * @param fieldName 要搜索的字段名称(字段类型为String,内容为中文)
     * @param keyword   搜索关键字(中文或拼音)
     * @param <T>       集合中对象的类型
     * @return 符合条件的集合
     */
    public static <T> List<T> searchByChineseOrPinyin(List<T> list, String fieldName, String keyword) {
        if (list == null || list.isEmpty() || keyword == null || keyword.isEmpty()) {
            return Collections.emptyList();
        }
        String lowerKeyword = keyword.toLowerCase();
        return list.stream()
                .filter(item -> {
                    String fieldValue = getFieldValue(item, fieldName);
                    if (fieldValue == null) {
                        return false;
                    }
                    String pinyin = getPinyin(fieldValue);
                    return fieldValue.contains(keyword) || pinyin.contains(lowerKeyword);
                })
                .collect(Collectors.toList());
    }

    /**
     * 获取对象指定字段的拼音
     *
     * @param obj       对象
     * @param fieldName 字段名称
     * @param <T>       对象类型
     * @return 字段的拼音
     */
    private static <T> String getFieldPinyin(T obj, String fieldName) {
        String fieldValue = getFieldValue(obj, fieldName);
        return getPinyin(fieldValue);
    }

    /**
     * 获取对象指定字段的值
     *
     * @param obj       对象
     * @param fieldName 字段名称
     * @param <T>       对象类型
     * @return 字段的值
     */
    private static <T> String getFieldValue(T obj, String fieldName) {
        try {
            Field field = getDeclaredField(obj.getClass(), fieldName);
            if (field == null) {
                return null;
            }
            field.setAccessible(true);
            Object value = field.get(obj);
            return value != null ? value.toString() : null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 递归获取字段,包括父类中的字段
     *
     * @param clazz     类对象
     * @param fieldName 字段名称
     * @return 字段对象
     */
    private static Field getDeclaredField(Class<?> clazz, String fieldName) {
        if (clazz == null) {
            return null;
        }
        try {
            return clazz.getDeclaredField(fieldName);
        } catch (NoSuchFieldException e) {
            // 递归查找父类中的字段
            return getDeclaredField(clazz.getSuperclass(), fieldName);
        }
    }

    /**
     * 获取中文字符串的拼音全拼
     *
     * @param chinese 中文字符串
     * @return 拼音全拼(小写,无声调)
     */
    public static String getPinyin(String chinese) {
        if (chinese == null || chinese.isEmpty()) {
            return "";
        }
        StringBuilder pinyinStr = new StringBuilder();
        char[] newChar = chinese.toCharArray();
        try {
            for (char c : newChar) {
                // 判断是否为中文字符
                if (Character.toString(c).matches("[\\u4E00-\\u9FA5]")) {
                    String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, FORMAT);
                    if (pinyinArray != null && pinyinArray.length > 0) {
                        pinyinStr.append(pinyinArray[0]);  // 取第一个拼音
                    }
                } else {
                    pinyinStr.append(c);  // 非中文字符原样输出
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return pinyinStr.toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值