一、需求
示例:
二、代码:
工具类:
package com.onehealthpro.oemr.modules.clinicinventory.utils;
import com.alibaba.druid.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
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.exception.BadHanyuPinyinOutputFormatCombination;
import java.math.BigDecimal;
@Slf4j
public class PinyinUtils {
/**
* 获取字符串拼音的第一个字母
* @param chinese
* @return
*/
public static String toFirstChar(String chinese){
String pinyinStr = "";
char[] newChar = chinese.toCharArray(); //转为单个字符
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < newChar.length; i++) {
if (newChar[i] > 128) {
try {
pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0].charAt(0);
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
}else{
pinyinStr += newChar[i];
}
}
return pinyinStr;
}
/**
* 汉字转为拼音
* @param chinese
* @return
*/
public static String toPinyin(String chinese){
String pinyinStr = "";
char[] newChar = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < newChar.length; i++) {
if (newChar[i] > 128) {
try {
pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0];
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
}else{
pinyinStr += newChar[i];
}
}
return pinyinStr;
}
/**
* 汉字转为拼音并获取大写的首字母;
* @param chinese
* @return
*/
public static String toPinyinAndGetFirstChar(String chinese){
StringBuilder pinyinStr = new StringBuilder();
char[] newChar = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (char c : newChar) {
if (c > 128) {
try {
log.info("newChar[i]={}", c);
Boolean aBoolean = cheackStr(String.valueOf(c));
System.out.println("是否是特殊字符:" + aBoolean);
if (!aBoolean) {
pinyinStr.append(PinyinHelper.toHanyuPinyinStringArray(c, defaultFormat)[0]);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pinyinStr.append(c);
}
}
return pinyinStr.toString().toUpperCase();
}
// 比较字符串
public static int compareString(String o1, String o2) {
if (o1 == null && o2 == null) {
return 0;
} else if (o1 == null) {
return 1; // null 值排在最后面
} else if (o2 == null) {
return -1; // null 值排在最后面
}
/*boolean o1Number = StringUtils.isNumber(o1);
boolean o2Number = StringUtils.isNumber(o2);
//两个都是数字
if (o1Number && o2Number){
BigDecimal x1Reult = new BigDecimal(o1);
BigDecimal x2Reult = new BigDecimal(o2);
return x2Reult.compareTo(x1Reult);
}else if (!o1Number ){//o1是字符串
return 1;//字符串放后面 数字放前面
}else if (!o2Number){//o2是字符串
return -1;//字符串放后面 数字放前面
}*/
//两个都不是数字 是字符串
String newo1 ;
newo1= toPinyinAndGetFirstChar(o1);
String newo2 ;
newo2 = toPinyinAndGetFirstChar(o2);
// return newo1.substring(0, 1).compareTo(newo2.substring(0, 1));
return compareChar(newo1.toCharArray(),newo2.toCharArray(),0);
}
public static Boolean cheackStr(String str){
String illegal = "`~!#%^&@*=+\\|{};:'\",<>/?○●★☆☉♀♂※¤╬の〆()()!~@#¥……&1234567890-";
return illegal.contains(str);
}
// 递归比较字符数组的对应位置上的字符是否相等
private static int compareChar(char[] c1, char[] c2, int index) {
if (index >= c1.length && index >= c2.length) {
// 比较到末尾都未发现字符不相等,返回true
return 0;
}
if (index >= c1.length){ //c1 长度小 放前面
return -1;
}
if (index >= c2.length){// c2长度长
return 1;
}
String s1 = String.valueOf(c1[index]);
String s2 = String.valueOf(c2[index]);
if (s1.compareTo(s2) != 0){
return s1.compareTo(s2);
}
return compareChar(c1,c2,index+1);
}
}
使用方法:
return reult.stream().sorted(Comparator.comparing(InventoryMaterialInformationRep::getStockType)
.thenComparing(InventoryMaterialInformationRep::getMaterialType)
.thenComparing(InventoryMaterialInformationRep::getProductName, PinyinUtils::compareString)
.thenComparing(InventoryMaterialInformationRep::getManufacturer,PinyinUtils::compareString)
.thenComparing(InventoryMaterialInformationRep::getExpiryDate,Comparator.nullsLast(Date::compareTo))).collect(Collectors.toList());