import org.springframework.stereotype.Component;
import java.text.Collator;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author Mr丶s
* @date 2024/5/25 下午4:09
* @description 汉字/数字/负数 多种组合排序
*/
@Component
public class SortChineseUtil {
// 获取中文排序器
private static final Collator COLLATOR = Collator.getInstance(Locale.CHINA);
static {
// 设置排序强度
COLLATOR.setStrength(Collator.PRIMARY);
}
/**
* 对集合中的字符串类型字段进行排序。
*
* @param items 需要排序的集合
* @param extractor 字段提取器
* @param <T> 集合中对象的类型
* @return 排序后的集合
*/
public static <T> List<T> sortCollection(List<T> items, Function<T, String> extractor) {
return items.stream()
.sorted(Comparator.comparing(extractor, SortChineseUtil::customCompare))
.collect(Collectors.toList());
}
/**
* 自定义比较逻辑。
*
* @param s1 第一个字符串
* @param s2 第二个字符串
* @return 比较结果
*/
private static int customCompare(String s1, String s2) {
// 分离数字和非数字部分
String[] parts1 = s1.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
String[] parts2 = s2.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
for (int i = 0; i < Math.min(parts1.length, parts2.length); i++) {
// 如果部分是数字
if (parts1[i].matches("-?\\d+") && parts2[i].matches("-?\\d+")) {
int num1 = Integer.parseInt(parts1[i]);
int num2 = Integer.parseInt(parts2[i]);
if (num1 != num2) {
return num1 - num2;
}
} else { // 如果部分是非数字
int result = COLLATOR.compare(parts1[i], parts2[i]);
if (result != 0) {
return result;
}
}
}
return Integer.compare(parts1.length, parts2.length);
}
}
集合对象中字段,汉字/数字/负数 多种组合排序
最新推荐文章于 2024-09-05 10:39:00 发布