From 5440cff37f4361f8b949bb5fcdb127d81e3b02c6 Mon Sep 17 00:00:00 2001 From: easepan Date: Wed, 9 Sep 2020 11:59:33 +0800 Subject: [PATCH 1/5] feat: new pair with 'of' method --- hutool-core/src/main/java/cn/hutool/core/lang/Pair.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java b/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java index fa9510594..726cb6fb4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java @@ -20,6 +20,10 @@ public class Pair extends CloneSupport> implements Serializable private final K key; private final V value; + public static Pair of(K key, V value) { + return new Pair<>(key, value); + } + /** * 构造 * From 018999e18f0a17585e6eae78561b49a2c2cb1730 Mon Sep 17 00:00:00 2001 From: easepan Date: Wed, 9 Sep 2020 18:32:17 +0800 Subject: [PATCH 2/5] feat: new object with 'of' method --- .../core/comparator/ComparatorChain.java | 21 +++++++++++++++++++ .../main/java/cn/hutool/core/lang/Pair.java | 8 +++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/ComparatorChain.java b/hutool-core/src/main/java/cn/hutool/core/comparator/ComparatorChain.java index 44fee28f0..e3c9838de 100644 --- a/hutool-core/src/main/java/cn/hutool/core/comparator/ComparatorChain.java +++ b/hutool-core/src/main/java/cn/hutool/core/comparator/ComparatorChain.java @@ -9,6 +9,7 @@ import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.Arrays; /** * 比较器链。此链包装了多个比较器,最终比较结果按照比较器顺序综合多个比较器结果。
@@ -81,6 +82,26 @@ public class ComparatorChain implements Chain, ComparatorChain< orderingBits = bits; } + public static ComparatorChain of(Comparator comparator) { + return of(comparator, false); + } + + public static ComparatorChain of(Comparator comparator, boolean reverse) { + return new ComparatorChain<>(comparator, reverse); + } + + public static ComparatorChain of(Comparator... comparators) { + return of(Arrays.asList(comparators)); + } + + public static ComparatorChain of(List> comparators) { + return new ComparatorChain<>(comparators); + } + + public static ComparatorChain of(List> comparators, BitSet bits) { + return new ComparatorChain<>(comparators, bits); + } + // ----------------------------------------------------------------------- /** * 在链的尾部添加比较器,使用正向排序 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java b/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java index 726cb6fb4..d38a8bddf 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java @@ -20,10 +20,6 @@ public class Pair extends CloneSupport> implements Serializable private final K key; private final V value; - public static Pair of(K key, V value) { - return new Pair<>(key, value); - } - /** * 构造 * @@ -35,6 +31,10 @@ public class Pair extends CloneSupport> implements Serializable this.value = value; } + public static Pair of(K key, V value) { + return new Pair<>(key, value); + } + /** * 获取键 * @return 键 From 7588535cacda12525e9826d8520233bcef66fc30 Mon Sep 17 00:00:00 2001 From: easepan Date: Wed, 9 Sep 2020 18:42:33 +0800 Subject: [PATCH 3/5] feat: new object with 'of' method --- .../java/cn/hutool/core/collection/ListUtil.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java index a02638d7c..d83bd66b6 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java @@ -474,4 +474,19 @@ public class ListUtil { public static List empty() { return Collections.emptyList(); } + + /** + * 像java11一样获取一个List + * @param ts 对象 + * @param 对象类型 + * @return 不可修改List + */ + public static List of(T... ts) { + if (ArrayUtil.isEmpty(ts)) { + return Collections.emptyList(); + } + List unmodifiableList = new ArrayList<>(ts.length); + Collections.addAll(unmodifiableList, ts); + return Collections.unmodifiableList(unmodifiableList); + } } From 9267c8217a7bbc484866d9b27f2f5ebf7d9fbbf5 Mon Sep 17 00:00:00 2001 From: easepan Date: Wed, 9 Sep 2020 18:50:22 +0800 Subject: [PATCH 4/5] feat: comparator for chinese pinyin --- .../hutool/core/comparator/CompareUtil.java | 34 +++++++++++++++++++ .../core/comparator/CompareUtilTest.java | 22 ++++++++++++ 2 files changed, 56 insertions(+) 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 c592e7a30..5c0766073 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,6 +1,10 @@ package cn.hutool.core.comparator; +import java.text.Collator; import java.util.Comparator; +import java.util.Locale; +import java.util.Objects; +import java.util.function.Function; /** * 比较工具类 @@ -108,4 +112,34 @@ public class CompareUtil { return result; } + + /** + * 中文比较器 + * + * @param keyExtractor 从对象中提取中文 + * @param 对象类型 + * + * @return 中文比较器 + */ + public static Comparator comparingPinyin(Function keyExtractor) { + return comparingPinyin(keyExtractor, false); + } + + /** + * 中文比较器 + * + * @param keyExtractor 从对象中提取中文 + * @param reverse 是否反序 + * @param 对象类型 + * + * @return 中文比较器 + */ + public static Comparator comparingPinyin(Function keyExtractor, boolean reverse) { + Objects.requireNonNull(keyExtractor); + Collator chineseCollator = Collator.getInstance(Locale.CHINESE); + if (reverse) { + return (o1, o2) -> chineseCollator.compare(keyExtractor.apply(o2), keyExtractor.apply(o1)); + } + return (o1, o2) -> chineseCollator.compare(keyExtractor.apply(o1), keyExtractor.apply(o2)); + } } 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 b1378be80..7527b0976 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 @@ -1,8 +1,13 @@ package cn.hutool.core.comparator; +import cn.hutool.core.collection.ListUtil; import org.junit.Assert; import org.junit.Test; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + public class CompareUtilTest { @Test @@ -13,4 +18,21 @@ public class CompareUtilTest { compare = CompareUtil.compare(null, "a", false); Assert.assertTrue(compare < 0); } + + @Test + public void comparingPinyin() { + List list = new ArrayList<>(); + Collections.addAll(list, "成都", "北京", "上海", "深圳"); + + List ascendingOrderResult = ListUtil.of("北京", "成都", "上海", "深圳"); + List descendingOrderResult = ListUtil.of("深圳", "上海", "成都", "北京"); + + // 正序 + list.sort(CompareUtil.comparingPinyin(e -> e)); + Assert.assertEquals(list, ascendingOrderResult); + + // 反序 + list.sort(CompareUtil.comparingPinyin(e -> e, true)); + Assert.assertEquals(list, descendingOrderResult); + } } From cdbbaf1b20c966a35fc7e8a493ce837314d5ece6 Mon Sep 17 00:00:00 2001 From: easepan Date: Wed, 9 Sep 2020 19:00:02 +0800 Subject: [PATCH 5/5] feat: comparator for chinese pinyin --- .../main/java/cn/hutool/core/comparator/CompareUtil.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 5c0766073..c41a4d000 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 @@ -136,10 +136,10 @@ public class CompareUtil { */ public static Comparator comparingPinyin(Function keyExtractor, boolean reverse) { Objects.requireNonNull(keyExtractor); - Collator chineseCollator = Collator.getInstance(Locale.CHINESE); + PinyinComparator pinyinComparator = new PinyinComparator(); if (reverse) { - return (o1, o2) -> chineseCollator.compare(keyExtractor.apply(o2), keyExtractor.apply(o1)); + return (o1, o2) -> pinyinComparator.compare(keyExtractor.apply(o2), keyExtractor.apply(o1)); } - return (o1, o2) -> chineseCollator.compare(keyExtractor.apply(o1), keyExtractor.apply(o2)); + return (o1, o2) -> pinyinComparator.compare(keyExtractor.apply(o1), keyExtractor.apply(o2)); } }