feat: comparator for chinese pinyin

This commit is contained in:
easepan 2020-09-09 18:50:22 +08:00
parent 7588535cac
commit 9267c8217a
2 changed files with 56 additions and 0 deletions

View File

@ -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 <T> 对象类型
*
* @return 中文比较器
*/
public static <T> Comparator<T> comparingPinyin(Function<T, String> keyExtractor) {
return comparingPinyin(keyExtractor, false);
}
/**
* 中文比较器
*
* @param keyExtractor 从对象中提取中文
* @param reverse 是否反序
* @param <T> 对象类型
*
* @return 中文比较器
*/
public static <T> Comparator<T> comparingPinyin(Function<T, String> 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));
}
}

View File

@ -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<String> list = new ArrayList<>();
Collections.addAll(list, "成都", "北京", "上海", "深圳");
List<String> ascendingOrderResult = ListUtil.of("北京", "成都", "上海", "深圳");
List<String> descendingOrderResult = ListUtil.of("深圳", "上海", "成都", "北京");
// 正序
list.sort(CompareUtil.comparingPinyin(e -> e));
Assert.assertEquals(list, ascendingOrderResult);
// 反序
list.sort(CompareUtil.comparingPinyin(e -> e, true));
Assert.assertEquals(list, descendingOrderResult);
}
}