diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/FuncComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/FuncComparator.java index 9113cdeb7..e59ed631c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/comparator/FuncComparator.java +++ b/hutool-core/src/main/java/cn/hutool/core/comparator/FuncComparator.java @@ -1,7 +1,5 @@ package cn.hutool.core.comparator; -import cn.hutool.core.util.ObjUtil; - import java.util.function.Function; /** @@ -53,7 +51,7 @@ public class FuncComparator extends NullComparator { */ @SuppressWarnings({"rawtypes", "unchecked"}) private int compare(final T o1, final T o2, final Comparable v1, final Comparable v2) { - int result = ObjUtil.compare(v1, v2); + int result = CompareUtil.compare(v1, v2, this.nullGreater); if (0 == result) { //避免TreeSet / TreeMap 过滤掉排序字段相同但是对象不相同的情况 result = CompareUtil.compare(o1, o2, this.nullGreater); diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/NullComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/NullComparator.java index 787026977..1e16e1c1c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/comparator/NullComparator.java +++ b/hutool-core/src/main/java/cn/hutool/core/comparator/NullComparator.java @@ -51,11 +51,6 @@ public class NullComparator implements Comparator, Serializable { return new NullComparator<>(nullGreater, comparator == null ? other : comparator.thenComparing(other)); } - @Override - public Comparator reversed() { - return new NullComparator<>((false == nullGreater), comparator == null ? null : comparator.reversed()); - } - /** * 不检查{@code null}的比较方法
* 用户可自行重写此方法自定义比较方式 diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/PropertyComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/PropertyComparator.java index 0b37117c7..4950d0054 100644 --- a/hutool-core/src/main/java/cn/hutool/core/comparator/PropertyComparator.java +++ b/hutool-core/src/main/java/cn/hutool/core/comparator/PropertyComparator.java @@ -14,7 +14,7 @@ public class PropertyComparator extends FuncComparator { private static final long serialVersionUID = 9157326766723846313L; /** - * 构造 + * 构造,默认{@code null}排在后(从小到大排序) * * @param property 属性名 */ @@ -26,7 +26,7 @@ public class PropertyComparator extends FuncComparator { * 构造 * * @param property 属性名 - * @param isNullGreater null值是否排在后(从小到大排序) + * @param isNullGreater {@code null}值是否排在后(从小到大排序) */ public PropertyComparator(final String property, final boolean isNullGreater) { super(isNullGreater, (bean)-> BeanUtil.getProperty(bean, property)); diff --git a/hutool-core/src/main/java/cn/hutool/core/regex/ReUtil.java b/hutool-core/src/main/java/cn/hutool/core/regex/ReUtil.java index 897e118fa..d820af4e6 100755 --- a/hutool-core/src/main/java/cn/hutool/core/regex/ReUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/regex/ReUtil.java @@ -1,6 +1,7 @@ package cn.hutool.core.regex; import cn.hutool.core.collection.SetUtil; +import cn.hutool.core.comparator.CompareUtil; import cn.hutool.core.comparator.StrLengthComparator; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Assert; @@ -11,15 +12,8 @@ import cn.hutool.core.lang.mutable.MutableObj; import cn.hutool.core.map.MapUtil; import cn.hutool.core.reflect.MethodUtil; import cn.hutool.core.text.StrUtil; -import cn.hutool.core.util.ObjUtil; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; import java.util.function.Consumer; import java.util.regex.MatchResult; import java.util.regex.Matcher; @@ -275,7 +269,7 @@ public class ReUtil { } //提取模板中的编号 - final TreeSet varNums = new TreeSet<>((o1, o2) -> ObjUtil.compare(o2, o1)); + final TreeSet varNums = new TreeSet<>((o1, o2) -> CompareUtil.compare(o2, o1)); final Matcher matcherForTemplate = PatternPool.GROUP_VAR.matcher(template); while (matcherForTemplate.find()) { varNums.add(Integer.parseInt(matcherForTemplate.group(1))); diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjUtil.java index 9cf4ed471..9a9629db5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ObjUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjUtil.java @@ -2,7 +2,6 @@ package cn.hutool.core.util; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.iter.IterUtil; -import cn.hutool.core.comparator.CompareUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.io.SerializeUtil; @@ -418,35 +417,6 @@ public class ObjUtil { return true; } - /** - * {@code null}安全的对象比较,{@code null}对象小于其他对象 - * - * @param 被比较对象类型 - * @param c1 对象1,可以为{@code null} - * @param c2 对象2,可以为{@code null} - * @return 比较结果,如果{@code c1 < c2},则返回值小于0,{@code c1 == c2} 返回0,{@code c1 > c2} 则返回值大于0 - * @see CompareUtil#compare(Comparable, Comparable) - * @since 3.0.7 - */ - public static > int compare(final T c1, final T c2) { - return CompareUtil.compare(c1, c2); - } - - /** - * {@code null}安全的对象比较 - * - * @param 被比较对象类型 - * @param c1 对象1,可以为{@code null} - * @param c2 对象2,可以为{@code null} - * @param nullGreater {@code null}对象是否大于其他对象 - * @return 比较结果,如果{@code c1 < c2},则返回值小于0,{@code c1 == c2} 返回0,{@code c1 > c2} 则返回值大于0 - * @see CompareUtil#compare(Comparable, Comparable, boolean) - * @since 3.0.7 - */ - public static > int compare(final T c1, final T c2, final boolean nullGreater) { - return CompareUtil.compare(c1, c2, nullGreater); - } - /** * 获得给定类的第一个泛型参数 * diff --git a/hutool-core/src/test/java/cn/hutool/core/comparator/CompareUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/comparator/CompareUtilTest.java index bb086567f..962a34c42 100644 --- a/hutool-core/src/test/java/cn/hutool/core/comparator/CompareUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/comparator/CompareUtilTest.java @@ -35,8 +35,8 @@ public class CompareUtilTest { @Test public void comparingIndexedTest() { - List data = ListUtil.of("1", "2", "3", "4", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); - List index = ListUtil.view("2", "1", "3", "4"); + final List data = ListUtil.of("1", "2", "3", "4", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); + final List index = ListUtil.view("2", "1", "3", "4"); data.sort(CompareUtil.comparingIndexed(e -> e, index)); //[1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] @@ -45,8 +45,8 @@ public class CompareUtilTest { @Test public void comparingIndexedTest2() { - List data = ListUtil.of("1", "2", "3", "4", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); - List index = ListUtil.view("2", "1", "3", "4"); + final List data = ListUtil.of("1", "2", "3", "4", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); + final List index = ListUtil.view("2", "1", "3", "4"); //正确排序,index.toArray() data.sort(CompareUtil.comparingIndexed(e -> e, index.toArray())); @@ -55,12 +55,22 @@ public class CompareUtilTest { } @Test public void comparingIndexedTest3() { - List data = ListUtil.of("1", "2", "3", "4", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); - String[] indexArray = new String[] {"2", "1", "3", "4"}; + final List data = ListUtil.of("1", "2", "3", "4", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); + final String[] indexArray = new String[] {"2", "1", "3", "4"}; //正确排序,array data.sort(CompareUtil.comparingIndexed(e -> e, indexArray)); //[5, 6, 7, 8, 9, 10, 2, 2, 1, 1, 3, 3, 4, 4] Assert.assertEquals(data, ListUtil.view("5", "6", "7", "8", "9", "10", "2", "2", "1", "1", "3", "3", "4", "4")); } + + @Test + public void compareNullTest() { + Assert.assertEquals(0, CompareUtil.compare(1, 1)); + Assert.assertEquals(1, CompareUtil.compare(1, null)); + Assert.assertEquals(-1, CompareUtil.compare(null, 1)); + + Assert.assertEquals(-1, CompareUtil.compare(1, null, true)); + Assert.assertEquals(1, CompareUtil.compare(null, 1, true)); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/comparator/PropertyComparatorTest.java b/hutool-core/src/test/java/cn/hutool/core/comparator/PropertyComparatorTest.java new file mode 100644 index 000000000..4336ad8f0 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/comparator/PropertyComparatorTest.java @@ -0,0 +1,56 @@ +package cn.hutool.core.comparator; + +import cn.hutool.core.collection.ListUtil; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +public class PropertyComparatorTest { + + @Test + public void sortNullTest() { + final ArrayList users = ListUtil.of( + new User("1", "d"), + new User("2", null), + new User("3", "a") + ); + + // 默认null在末尾 + final List sortedList1 = ListUtil.sort(users, new PropertyComparator<>("b")); + Assert.assertEquals("a", sortedList1.get(0).getB()); + Assert.assertEquals("d", sortedList1.get(1).getB()); + Assert.assertNull(sortedList1.get(2).getB()); + + // null在首 + final List sortedList2 = ListUtil.sort(users, new PropertyComparator<>("b", false)); + Assert.assertNull(sortedList2.get(0).getB()); + Assert.assertEquals("a", sortedList2.get(1).getB()); + Assert.assertEquals("d", sortedList2.get(2).getB()); + } + + @Test + public void reversedTest() { + final ArrayList users = ListUtil.of( + new User("1", "d"), + new User("2", null), + new User("3", "a") + ); + + // 反序 + final List sortedList = ListUtil.sort(users, new PropertyComparator<>("b").reversed()); + Assert.assertNull(sortedList.get(0).getB()); + Assert.assertEquals("d", sortedList.get(1).getB()); + Assert.assertEquals("a", sortedList.get(2).getB()); + } + + @Data + @AllArgsConstructor + static class User{ + private String a; + private String b; + } +} diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ObjUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ObjUtilTest.java index 98baca4dd..a4c4a5a1b 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/ObjUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ObjUtilTest.java @@ -199,16 +199,6 @@ public class ObjUtilTest { Assert.assertTrue(ObjUtil.isValidIfNumber(Float.MIN_VALUE)); } - @Test - public void compareTest() { - Assert.assertEquals(0, ObjUtil.compare(1, 1)); - Assert.assertEquals(1, ObjUtil.compare(1, null)); - Assert.assertEquals(-1, ObjUtil.compare(null, 1)); - - Assert.assertEquals(-1, ObjUtil.compare(1, null, true)); - Assert.assertEquals(1, ObjUtil.compare(null, 1, true)); - } - @Test public void getTypeArgumentTest() { final Bean bean = new Bean(1);