From 9267c8217a7bbc484866d9b27f2f5ebf7d9fbbf5 Mon Sep 17 00:00:00 2001 From: easepan Date: Wed, 9 Sep 2020 18:50:22 +0800 Subject: [PATCH] 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); + } }