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 {
/**
* 获取自然排序器,即默认排序器
*
+ *
+ * - 如需对null友好操作如下
+ * Comparator.nullsFirst(Comparator.naturalOrder())
+ * Comparator.nullsLast(Comparator.naturalOrder())
+ * Comparator.nullsLast(CompareUtil.naturalComparator())
+ * Comparator.nullsFirst(CompareUtil.naturalComparator())
+ *
+ *
* @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 super T, ? extends U> keyExtractor, final U... objs) {
+ public static Comparator comparingIndexed(final Function super T, ? extends U> 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 super T, ? extends U> 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 索引比较器