diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/CompareUtil.java b/hutool-core/src/main/java/cn/hutool/core/comparator/CompareUtil.java index 945045668..268e9b7f0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/comparator/CompareUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/comparator/CompareUtil.java @@ -1,5 +1,7 @@ package cn.hutool.core.comparator; +import java.lang.reflect.Array; +import java.util.Collection; import java.util.Comparator; import java.util.Objects; import java.util.function.Function; @@ -94,6 +96,14 @@ public class CompareUtil { /** * 获取自然排序器,即默认排序器 * + * + * * @param 排序节点类型 * @return 默认排序器 * @since 5.7.21 @@ -236,6 +246,7 @@ public class CompareUtil { /** * 索引比较器
* 通过keyExtractor函数,提取对象的某个属性或规则,根据提供的排序数组,完成比较
+ * objs中缺失的,默认排序在前面(atEndIfMiss=false)
* * @param keyExtractor 从对象中提取中文(参与比较的内容) * @param objs 参与排序的数组,数组的元素位置决定了对象的排序先后 @@ -245,17 +256,38 @@ public class CompareUtil { * @since 5.8.0 */ @SuppressWarnings("unchecked") - public static Comparator comparingIndexed(final Function keyExtractor, final U... objs) { + public static Comparator comparingIndexed(final Function keyExtractor, final U[] objs) { return comparingIndexed(keyExtractor, false, objs); } + /** + * 索引比较器
+ * 通过keyExtractor函数,提取对象的某个属性或规则,根据提供的排序数组,完成比较
+ * objs中缺失的,默认排序在前面(atEndIfMiss=false)
+ * + * @param keyExtractor 从对象中提取中文(参与比较的内容) + * @param objs 参与排序的集合对象,数组的元素位置决定了对象的排序先后 + * @param 对象类型 + * @param 数组对象类型 + * @return 索引比较器 + * @since 6.0.0 + */ + @SuppressWarnings("unchecked") + public static Comparator comparingIndexed(final Function keyExtractor, final Collection objs) { + U[] array = null; + if (objs != null && objs.size() > 0) { + array = objs.toArray((U[]) Array.newInstance(objs.iterator().next().getClass(), objs.size())); + } + return comparingIndexed(keyExtractor, false, array); + } + /** * 索引比较器
* 通过keyExtractor函数,提取对象的某个属性或规则,根据提供的排序数组,完成比较
* * @param keyExtractor 从对象中提取排序键的函数(参与比较的内容) - * @param atEndIfMiss 如果不在列表中是否排在后边 - * @param objs 参与排序的数组,数组的元素位置决定了对象的排序先后 + * @param atEndIfMiss 如果不在列表中是否排在后边; true:排在后边; false:排在前边 + * @param objs 参与排序的数组,数组的元素位置决定了对象的排序先后, 示例:int[] objs = new int[]{3, 2, 1, 4, 5,6}; * @param 对象类型 * @param 数组对象类型 * @return 索引比较器