引入pom依赖:
<!--汉字首字母处理-->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
工具类(ChineseCharacterHelper.java):
import net.sourceforge.pinyin4j.PinyinHelper;
public class ChineseCharacterHelper {
/**
* 提取汉字字符串的首字母
* @param str 汉字字符串
* @return
*/
public static String getSpells(String str) {
if (isNull(str)) {
return "";
}
String convert = "";
for (int j = 0; j < str.length(); j++) {
char word = str.charAt(j);
// 提取汉字的首字母
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
if (pinyinArray != null) {
convert += pinyinArray[0].charAt(0);
}
else {
convert += word;
}
}
convert = string2AllTrim(convert);
return convert.toUpperCase();
}
/**
* 去掉字符串包含的所有空格
*
* @param value
* @return
*/
public static String string2AllTrim(String value) {
if (isNull(value)) {
return "";
}
return value.trim().replace(" ", "");
}
/*
* 判断字符串是否为空
*/
public static boolean isNull(Object strData) {
if (strData == null || String.valueOf(strData).trim().equals("")) {
return true;
}
return false;
}
}
sql检索出的List<LabourStaffAResp> list 中字段 nameIsNumbersOrSpecialCharacters如果是1则为数字或特殊字符(最后排序放于最后且汉字首字母设置为“#”),为0则为拼音或汉字,可以按照汉字进行排序,代码如下:
List<LabourStaffAResp> collect = new ArrayList<>();
// 按照是否是特殊字符分为两个list
Map<Integer, List<LabourStaffAResp>> labourStaffARespMap = list.stream().collect(Collectors.groupingBy(LabourStaffAResp::getNameIsNumbersOrSpecialCharacters));
List<LabourStaffAResp> normalList = labourStaffARespMap.get(0);//正常list
if(null == normalList){ normalList = new ArrayList<>();}
// 对正常list进行排序 start
Comparator comparator = Collator.getInstance(Locale.CHINA);
Collections.sort(normalList, (p1, p2) -> comparator.compare(ChineseCharacterHelper.getSpells((p1.getName().substring(0,1))).toLowerCase(), ChineseCharacterHelper.getSpells(p2.getName().substring(0,1)).toLowerCase()));
// 对正常list进行排序 end
List<LabourStaffAResp> otherList = labourStaffARespMap.get(1);
if(null == otherList){ otherList = new ArrayList<>();}
if(normalList.size()>0)
collect.addAll(normalList);
if(otherList.size()>0)
collect.addAll(otherList);
collect.forEach(x->{
// 不含数字或特殊字符的设置首字母,否则设置为“#”
x.setNameFirstLetter(Integer.valueOf(1).equals(x.getNameIsNumbersOrSpecialCharacters())?"#":ChineseCharacterHelper.getSpells(x.getName()).substring(0, 1).toUpperCase());
});