@Test public void test_sort_pinyin() { Collator cmp = Collator.getInstance(java.util.Locale.CHINA); String[] arr = {"张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A", "1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情"}; List<String> list = Arrays.asList(arr); Arrays.sort(arr, cmp); System.out.println(list); }
这个排序有些问题,有些汉字的排序不正确,上面的程序就有些问题。
执行测试,输出如下:
$%$#, 123, 1哈哈a, 1哈哈A, 1哈哈b, JAVA, 哈, 哈哈, 哈哈A, 李四, 王五, 张三, 赵六, 怡情
试了pinyin4j, http://pinyin4j.sourceforge.net/
public class PinyinComparator implements Comparator<Object> { public int compare(Object o1, Object o2) { String str1 = (String) o1; String str2 = (String) o2; return transHanZi(str1).compareTo(transHanZi(str2)); } private String transHanZi(String hanzi){ StringBuilder builder = new StringBuilder(); int i = 0; while (i < hanzi.length()) { char ch = hanzi.charAt(i); if (ch < 128) { builder.append(ch); } else { String[] pinyin = PinyinHelper.toHanyuPinyinStringArray(ch); if (pinyin != null && pinyin.length > 0) { builder.append('搜'); builder.append(pinyin[0].substring(0, pinyin[0].length() - 1)); } } i += 1; } return builder.toString(); } }
public void test_sort_pinyin2() { String[] arr = {"张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A", "1哈哈A", "1啊哈哈b", "1哈哈a", "哈哈", "哈", "怡情", "和好", "伙计"}; List<String> list = Arrays.asList(arr); Arrays.sort(arr, new PinyinComparator()); System.out.println(list); }
执行测试,输出如下:
[$%$#, 123, 1啊哈哈b, 1哈哈A, 1哈哈a, JAVA, 哈, 哈哈, 哈哈A, 和好, 伙计, 李四, 王五, 怡情, 张三, 赵六]