|
|
@@ -4,31 +4,103 @@ import cn.hutool.core.lang.Chain;
|
|
|
|
|
|
import java.io.Serializable;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.BitSet;
|
|
|
import java.util.Comparator;
|
|
|
import java.util.Iterator;
|
|
|
import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
-import java.util.Arrays;
|
|
|
|
|
|
/**
|
|
|
* 比较器链。此链包装了多个比较器,最终比较结果按照比较器顺序综合多个比较器结果。<br>
|
|
|
* 按照比较器链的顺序分别比较,如果比较出相等则转向下一个比较器,否则直接返回<br>
|
|
|
* 此类copy from Apache-commons-collections
|
|
|
- *
|
|
|
+ *
|
|
|
* @author looly
|
|
|
* @since 3.0.7
|
|
|
*/
|
|
|
public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<E>>, Comparator<E>, Serializable {
|
|
|
private static final long serialVersionUID = -2426725788913962429L;
|
|
|
-
|
|
|
- /** 比较器链. */
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 比较器链.
|
|
|
+ */
|
|
|
private final List<Comparator<E>> chain;
|
|
|
- /** 对应比较器位置是否反序. */
|
|
|
+ /**
|
|
|
+ * 对应比较器位置是否反序.
|
|
|
+ */
|
|
|
private final BitSet orderingBits;
|
|
|
- /** 比较器是否被锁定。锁定的比较器链不能再添加新的比较器。比较器会在开始比较时开始加锁。 */
|
|
|
+ /**
|
|
|
+ * 比较器是否被锁定。锁定的比较器链不能再添加新的比较器。比较器会在开始比较时开始加锁。
|
|
|
+ */
|
|
|
private boolean lock = false;
|
|
|
|
|
|
+ //------------------------------------------------------------------------------------- Static method start
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建 {@link ComparatorChain}
|
|
|
+ *
|
|
|
+ * @param <E> 被比较对象类型
|
|
|
+ * @param comparator 比较器
|
|
|
+ * @return {@link ComparatorChain}
|
|
|
+ * @since 5.4.3
|
|
|
+ */
|
|
|
+ public static <E> ComparatorChain<E> of(Comparator<E> comparator) {
|
|
|
+ return of(comparator, false);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建 {@link ComparatorChain}
|
|
|
+ *
|
|
|
+ * @param <E> 被比较对象类型
|
|
|
+ * @param comparator 比较器
|
|
|
+ * @param reverse 是否反向
|
|
|
+ * @return {@link ComparatorChain}
|
|
|
+ * @since 5.4.3
|
|
|
+ */
|
|
|
+ public static <E> ComparatorChain<E> of(Comparator<E> comparator, boolean reverse) {
|
|
|
+ return new ComparatorChain<>(comparator, reverse);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建 {@link ComparatorChain}
|
|
|
+ *
|
|
|
+ * @param <E> 被比较对象类型
|
|
|
+ * @param comparators 比较器数组
|
|
|
+ * @return {@link ComparatorChain}
|
|
|
+ * @since 5.4.3
|
|
|
+ */
|
|
|
+ @SafeVarargs
|
|
|
+ public static <E> ComparatorChain<E> of(Comparator<E>... comparators) {
|
|
|
+ return of(Arrays.asList(comparators));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建 {@link ComparatorChain}
|
|
|
+ *
|
|
|
+ * @param <E> 被比较对象类型
|
|
|
+ * @param comparators 比较器列表
|
|
|
+ * @return {@link ComparatorChain}
|
|
|
+ * @since 5.4.3
|
|
|
+ */
|
|
|
+ public static <E> ComparatorChain<E> of(List<Comparator<E>> comparators) {
|
|
|
+ return new ComparatorChain<>(comparators);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建 {@link ComparatorChain}
|
|
|
+ *
|
|
|
+ * @param <E> 被比较对象类型
|
|
|
+ * @param comparators 比较器列表
|
|
|
+ * @param bits {@link Comparator} 列表对应的排序boolean值,true表示正序,false反序
|
|
|
+ * @return {@link ComparatorChain}
|
|
|
+ * @since 5.4.3
|
|
|
+ */
|
|
|
+ public static <E> ComparatorChain<E> of(List<Comparator<E>> comparators, BitSet bits) {
|
|
|
+ return new ComparatorChain<>(comparators, bits);
|
|
|
+ }
|
|
|
+ //------------------------------------------------------------------------------------- Static method start
|
|
|
+
|
|
|
/**
|
|
|
* 构造空的比较器链,必须至少有一个比较器,否则会在compare时抛出{@link UnsupportedOperationException}
|
|
|
*/
|
|
|
@@ -37,7 +109,7 @@ public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- *构造,初始化单一比较器。比较器为正序
|
|
|
+ * 构造,初始化单一比较器。比较器为正序
|
|
|
*
|
|
|
* @param comparator 在比较器链中的第一个比较器
|
|
|
*/
|
|
|
@@ -49,7 +121,7 @@ public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<
|
|
|
* 构造,初始化单一比较器。自定义正序还是反序
|
|
|
*
|
|
|
* @param comparator 在比较器链中的第一个比较器
|
|
|
- * @param reverse 是否反序,true表示反序,false正序
|
|
|
+ * @param reverse 是否反序,true表示反序,false正序
|
|
|
*/
|
|
|
public ComparatorChain(final Comparator<E> comparator, final boolean reverse) {
|
|
|
chain = new ArrayList<>(1);
|
|
|
@@ -62,9 +134,9 @@ public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<
|
|
|
|
|
|
/**
|
|
|
* 构造,使用已有的比较器列表
|
|
|
- *
|
|
|
+ *
|
|
|
* @param list 比较器列表
|
|
|
- * @see #ComparatorChain(List,BitSet)
|
|
|
+ * @see #ComparatorChain(List, BitSet)
|
|
|
*/
|
|
|
public ComparatorChain(final List<Comparator<E>> list) {
|
|
|
this(list, new BitSet(list.size()));
|
|
|
@@ -82,27 +154,6 @@ public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<
|
|
|
orderingBits = bits;
|
|
|
}
|
|
|
|
|
|
- public static <E> ComparatorChain<E> of(Comparator<E> comparator) {
|
|
|
- return of(comparator, false);
|
|
|
- }
|
|
|
-
|
|
|
- public static <E> ComparatorChain<E> of(Comparator<E> comparator, boolean reverse) {
|
|
|
- return new ComparatorChain<>(comparator, reverse);
|
|
|
- }
|
|
|
-
|
|
|
- public static <E> ComparatorChain<E> of(Comparator<E>... comparators) {
|
|
|
- return of(Arrays.asList(comparators));
|
|
|
- }
|
|
|
-
|
|
|
- public static <E> ComparatorChain<E> of(List<Comparator<E>> comparators) {
|
|
|
- return new ComparatorChain<>(comparators);
|
|
|
- }
|
|
|
-
|
|
|
- public static <E> ComparatorChain<E> of(List<Comparator<E>> comparators, BitSet bits) {
|
|
|
- return new ComparatorChain<>(comparators, bits);
|
|
|
- }
|
|
|
-
|
|
|
- // -----------------------------------------------------------------------
|
|
|
/**
|
|
|
* 在链的尾部添加比较器,使用正向排序
|
|
|
*
|
|
|
@@ -117,7 +168,7 @@ public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<
|
|
|
* 在链的尾部添加比较器,使用给定排序方式
|
|
|
*
|
|
|
* @param comparator {@link Comparator} 比较器
|
|
|
- * @param reverse 是否反序,true表示正序,false反序
|
|
|
+ * @param reverse 是否反序,true表示正序,false反序
|
|
|
* @return this
|
|
|
*/
|
|
|
public ComparatorChain<E> addComparator(final Comparator<E> comparator, final boolean reverse) {
|
|
|
@@ -133,10 +184,10 @@ public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<
|
|
|
/**
|
|
|
* 替换指定位置的比较器,保持原排序方式
|
|
|
*
|
|
|
- * @param index 位置
|
|
|
+ * @param index 位置
|
|
|
* @param comparator {@link Comparator}
|
|
|
* @return this
|
|
|
- * @exception IndexOutOfBoundsException if index < 0 or index >= size()
|
|
|
+ * @throws IndexOutOfBoundsException if index < 0 or index >= size()
|
|
|
*/
|
|
|
public ComparatorChain<E> setComparator(final int index, final Comparator<E> comparator) throws IndexOutOfBoundsException {
|
|
|
return setComparator(index, comparator, false);
|
|
|
@@ -145,9 +196,9 @@ public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<
|
|
|
/**
|
|
|
* 替换指定位置的比较器,替换指定排序方式
|
|
|
*
|
|
|
- * @param index 位置
|
|
|
+ * @param index 位置
|
|
|
* @param comparator {@link Comparator}
|
|
|
- * @param reverse 是否反序,true表示正序,false反序
|
|
|
+ * @param reverse 是否反序,true表示正序,false反序
|
|
|
* @return this
|
|
|
*/
|
|
|
public ComparatorChain<E> setComparator(final int index, final Comparator<E> comparator, final boolean reverse) {
|
|
|
@@ -197,12 +248,13 @@ public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<
|
|
|
|
|
|
/**
|
|
|
* 是否已经被锁定。当开始比较时(调用compare方法)此值为true
|
|
|
+ *
|
|
|
* @return true = ComparatorChain cannot be modified; false = ComparatorChain can still be modified.
|
|
|
*/
|
|
|
public boolean isLocked() {
|
|
|
return lock;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
@Override
|
|
|
public Iterator<Comparator<E>> iterator() {
|
|
|
return this.chain.iterator();
|
|
|
@@ -212,7 +264,7 @@ public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<
|
|
|
public ComparatorChain<E> addChain(Comparator<E> element) {
|
|
|
return this.addComparator(element);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 执行比较<br>
|
|
|
* 按照比较器链的顺序分别比较,如果比较出相等则转向下一个比较器,否则直接返回
|
|
|
@@ -228,7 +280,7 @@ public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<
|
|
|
checkChainIntegrity();
|
|
|
lock = true;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
final Iterator<Comparator<E>> comparators = chain.iterator();
|
|
|
Comparator<? super E> comparator;
|
|
|
int retval;
|
|
|
@@ -278,6 +330,7 @@ public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<
|
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------------------------------------------------------- Private method start
|
|
|
+
|
|
|
/**
|
|
|
* 被锁定时抛出异常
|
|
|
*
|
|
|
@@ -291,7 +344,7 @@ public class ComparatorChain<E> implements Chain<Comparator<E>, ComparatorChain<
|
|
|
|
|
|
/**
|
|
|
* 检查比较器链是否为空,为空抛出异常
|
|
|
- *
|
|
|
+ *
|
|
|
* @throws UnsupportedOperationException 为空抛出此异常
|
|
|
*/
|
|
|
private void checkChainIntegrity() {
|