Java模块 -- 数组集合中文汉字排序(支持生僻汉字)

    xiaoxiao2021-03-26  22

    这里举例List集合 , 对list中的中文进行排序 , 按照中文拼音首字母.

    支持生僻汉字的话 , 需要使用一个jar包 , 链接地址如下

    com.ibm.icu_3.8.jar

     

    传统的 : 

    List<String> list = new ArrayList<String>(); list.add("一鸣惊人 -Y"); list.add("人山人海 -R"); list.add("海阔天空 -H"); list.add("空前绝后 -K"); list.add("后来居上 -H"); Comparator<Object> cmp = java.text.Collator.getInstance(java.util.Locale.CHINA); Collections.sort(list, cmp); for (String str : list) { System.out.println(str); }

    输出结果:

    海阔天空 -H 后来居上 -H 空前绝后 -K 人山人海 -R 一鸣惊人 -Y

    这种看上去没有什么问题 , 但是换上生僻字之后 , 就会出现错误.

    比如这样子:

    List<String> list1 = new ArrayList<String>(); list1.add("网易汽车 - W"); list1.add("新民汽车网 - X"); list1.add("钛媒体 - T"); list1.add("瘾科技 - Y"); list1.add("昕薇网 - X"); list1.add("安倍 - A"); list1.add("中国 - Z"); list1.add("中心 - Z"); Comparator<Object> cmp = java.text.Collator.getInstance(java.util.Locale.CHINA); Collections.sort(list1, cmp); for (String str : list1) { System.out.println(str); }

    输出结果:

    安倍 - A 网易汽车 - W 新民汽车网 - X 中国 - Z 中心 - Z 昕薇网 - X 钛媒体 - T 瘾科技 - Y

    这个结果就是错误的 , "钛媒体 - T" 应该在第二位...

    解决方案 : 

    使用 "com.ibm.icu.text.Collator" 替换 "java.text.Collator"

    使用 "com.ibm.icu.util.ULocale.SIMPLIFIED_CHINESE" 替换 "java.util.Locale.CHINA"

    比如这样子:

    List<String> list2 = new ArrayList<String>(); list2.add("网易汽车 - W"); list2.add("新民汽车网 - X"); list2.add("钛媒体 - T"); list2.add("瘾科技 - Y"); list2.add("昕薇网 - X"); list2.add("安倍 - A"); list2.add("中国 - Z"); list2.add("中心 - Z"); Comparator<Object> cmp2 = com.ibm.icu.text.Collator.getInstance(com.ibm.icu.util.ULocale.SIMPLIFIED_CHINESE); Collections.sort(list2, cmp2); for (String str : list2) { System.out.println(str); }

    输出结果:

    安倍 - A 钛媒体 - T 网易汽车 - W 昕薇网 - X 新民汽车网 - X 瘾科技 - Y 中国 - Z 中心 - Z

    这下子 , 生僻汉字的输出也正确了

    数组汉字排序

    String[] names = {"王林", "杨宝", "李镇", "刘迪", "刘波"}; Arrays.sort(names, com.ibm.icu.text.Collator.getInstance(ULocale.SIMPLIFIED_CHINESE)); System.out.println(Arrays.toString(names));

    输出 : [李镇, 刘波, 刘迪, 王林, 杨宝]

     

    =====更新于2018-08-22====

    最近有个需求,需要 中英数字 混合排序,不是单纯的List<String>,而是根据List集合中对象的某个属性。

    直接上代码:

    /** * @author CYX */ public class AppMainTest { public final static Comparator comparator = com.ibm.icu.text.Collator.getInstance(com.ibm.icu.util.ULocale.SIMPLIFIED_CHINESE); public static void main(String[] args) { List<TestObject> testObjects = new ArrayList<TestObject>(); testObjects.add(new TestObject("A")); testObjects.add(new TestObject("网易汽车w - W")); testObjects.add(new TestObject("中国 - Z")); testObjects.add(new TestObject("B")); testObjects.add(new TestObject("新民汽车网 - X")); testObjects.add(new TestObject("中心 - Z")); testObjects.add(new TestObject("C")); testObjects.add(new TestObject("钛媒体 - T")); testObjects.add(new TestObject("2-使命召唤")); testObjects.add(new TestObject("D")); testObjects.add(new TestObject("瘾科技 - Y")); testObjects.add(new TestObject("昕薇网 - X")); testObjects.add(new TestObject("1")); testObjects.add(new TestObject("安倍 - A")); testObjects.add(new TestObject("999")); testObjects.add(new TestObject("4")); testObjects.add(new TestObject("1-英雄联盟")); testObjects.add(new TestObject("8")); Collections.sort(testObjects, new Comparator<TestObject>() { @Override public int compare(TestObject o1, TestObject o2) { int result = comparator.compare(o1.getName(), o2.getName()); return result; } }); for (TestObject str : testObjects) { System.out.println(str); } } }

    依旧是 沿用上面那个Jar包,输出结果:

     

    转载请注明原文地址: https://ju.6miu.com/read-661902.html

    最新回复(0)