diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/BaseFieldComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/BaseFieldComparator.java
new file mode 100644
index 000000000..86db0f769
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/comparator/BaseFieldComparator.java
@@ -0,0 +1,60 @@
+package cn.hutool.core.comparator;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.ReflectUtil;
+
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.util.Comparator;
+
+/**
+ * Bean字段排序器
+ * 参阅feilong-core中的PropertyComparator
+ *
+ * @param 被比较的Bean
+ * @author Looly
+ */
+public abstract class BaseFieldComparator implements Comparator, Serializable {
+ private static final long serialVersionUID = -3482464782340308755L;
+
+ /**
+ * 比较器方法
+ *
+ * @param o1 对象1
+ * @param o2 对象2
+ * @return -1 0 1
+ */
+ @Override
+ public abstract int compare(T o1, T o2);
+
+ protected int compareItem(T o1, T o2, Field field) {
+ if (o1 == o2) {
+ return 0;
+ } else if (null == o1) {// null 排在后面
+ return 1;
+ } else if (null == o2) {
+ return -1;
+ }
+
+ Comparable> v1;
+ Comparable> v2;
+ try {
+ v1 = (Comparable>) ReflectUtil.getFieldValue(o1, field);
+ v2 = (Comparable>) ReflectUtil.getFieldValue(o2, field);
+ } catch (Exception e) {
+ throw new ComparatorException(e);
+ }
+
+ return compare(o1, o2, v1, v2);
+ }
+
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ private int compare(T o1, T o2, Comparable fieldValue1, Comparable fieldValue2) {
+ int result = ObjectUtil.compare(fieldValue1, fieldValue2);
+ if (0 == result) {
+ //避免TreeSet / TreeMap 过滤掉排序字段相同但是对象不相同的情况
+ result = CompareUtil.compare(o1, o2, true);
+ }
+ return result;
+ }
+}
diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/FieldComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/FieldComparator.java
index b16bb910d..6ab96fe16 100644
--- a/hutool-core/src/main/java/cn/hutool/core/comparator/FieldComparator.java
+++ b/hutool-core/src/main/java/cn/hutool/core/comparator/FieldComparator.java
@@ -1,23 +1,18 @@
package cn.hutool.core.comparator;
-import java.io.Serializable;
-import java.lang.reflect.Field;
-import java.util.Comparator;
-
import cn.hutool.core.util.ClassUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
+import java.lang.reflect.Field;
+
/**
* Bean字段排序器
* 参阅feilong-core中的PropertyComparator
*
- * @author Looly
- *
* @param 被比较的Bean
+ * @author Looly
*/
-public class FieldComparator implements Comparator, Serializable {
+public class FieldComparator extends BaseFieldComparator {
private static final long serialVersionUID = 9157326766723846313L;
private final Field field;
@@ -30,40 +25,13 @@ public class FieldComparator implements Comparator, Serializable {
*/
public FieldComparator(Class beanClass, String fieldName) {
this.field = ClassUtil.getDeclaredField(beanClass, fieldName);
- if(this.field == null){
+ if (this.field == null) {
throw new IllegalArgumentException(StrUtil.format("Field [{}] not found in Class [{}]", fieldName, beanClass.getName()));
}
}
@Override
public int compare(T o1, T o2) {
- if (o1 == o2) {
- return 0;
- } else if (null == o1) {// null 排在后面
- return 1;
- } else if (null == o2) {
- return -1;
- }
-
- Comparable> v1;
- Comparable> v2;
- try {
- v1 = (Comparable>) ReflectUtil.getFieldValue(o1, this.field);
- v2 = (Comparable>) ReflectUtil.getFieldValue(o2, this.field);
- } catch (Exception e) {
- throw new ComparatorException(e);
- }
-
- return compare(o1, o2, v1, v2);
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- private int compare(T o1, T o2, Comparable fieldValue1, Comparable fieldValue2) {
- int result = ObjectUtil.compare(fieldValue1, fieldValue2);
- if(0 == result) {
- //避免TreeSet / TreeMap 过滤掉排序字段相同但是对象不相同的情况
- result = CompareUtil.compare(o1, o2, true);
- }
- return result;
+ return compareItem(o1, o2, this.field);
}
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/FieldsComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/FieldsComparator.java
new file mode 100644
index 000000000..ff20eb628
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/comparator/FieldsComparator.java
@@ -0,0 +1,50 @@
+package cn.hutool.core.comparator;
+
+import cn.hutool.core.util.ClassUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.core.util.StrUtil;
+
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.util.Comparator;
+
+/**
+ * Bean字段排序器
+ * 参阅feilong-core中的PropertyComparator
+ *
+ * @param 被比较的Bean
+ * @author Looly
+ */
+public class FieldsComparator extends BaseFieldComparator {
+ private static final long serialVersionUID = 8649196282886500803L;
+
+ private final Field[] fields;
+
+ /**
+ * 构造
+ *
+ * @param beanClass Bean类
+ * @param fieldNames 多个字段名
+ */
+ public FieldsComparator(Class beanClass, String... fieldNames) {
+ this.fields = new Field[fieldNames.length];
+ for (int i = 0; i < fieldNames.length; i++) {
+ this.fields[i] = ClassUtil.getDeclaredField(beanClass, fieldNames[i]);
+ if (this.fields[i] == null) {
+ throw new IllegalArgumentException(StrUtil.format("Field [{}] not found in Class [{}]", fieldNames[i], beanClass.getName()));
+ }
+ }
+ }
+
+ @Override
+ public int compare(T o1, T o2) {
+ for (Field field : fields) {
+ int compare = this.compareItem(o1, o2, field);
+ if (compare != 0) {
+ return compare;
+ }
+ }
+ return 0;
+ }
+}