这里举例List集合 , 对list中的中文进行排序 , 按照中文拼音首字母.
支持生僻汉字的话 , 需要使用一个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包,输出结果: