<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;
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);
}
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());
}
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());
}
private static <T> String getFieldPinyin(T obj, String fieldName) {
String fieldValue = getFieldValue(obj, fieldName);
return getPinyin(fieldValue);
}
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;
}
}
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);
}
}
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();
}
}