原文出自 http://www.blogjava.net/jeff-lau/archive/2007/12/21/169257.html 感谢这位作者。
以下是我仿照原文做的一个比较拼音的中文排序。
下面这段代码测试通过了的,方便大家去调试去理解。。。。我只是菜鸟学学,并没有深入的去理解。。。
但我希望,大家积极的提出问题。。。,我更希望,与大家共同进步。
当然它用到了一个lib我已经提供在附件里面。供大家下载。
public class Person implements Comparable<Person> { // Comparator<Person> public Person(){ } public Person(String name,int age,String phone){ this.name= name; this.age=age; this.phone= phone; } private String name; private int age; private String phone; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String toString(){ return getName(); } public int compare(Person o1, Person o2) { Comparator cmp = Collator.getInstance(java.util.Locale.JAPAN); return cmp.compare(o1.getName(), o2.getName()); } /** * 字符的拼音,多音字就得到第一个拼音。不是汉字,就return null。 */ private String pinyin(char c) { String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c); if (pinyins == null) { return null; } return pinyins[0]; } // public int compare(Person cb1, Person cb2) { // String o1=cb1.getName(); // String o2 = cb2.getName(); // // for (int i = 0; i < o1.length() && i < o2.length(); i++) { // // int codePoint1 = o1.charAt(i); // int codePoint2 = o2.charAt(i); // // if (Character.isSupplementaryCodePoint(codePoint1) // || Character.isSupplementaryCodePoint(codePoint2)) { // i++; // } // // if (codePoint1 != codePoint2) { // if (Character.isSupplementaryCodePoint(codePoint1) // || Character.isSupplementaryCodePoint(codePoint2)) { // return codePoint1 - codePoint2; // } // // String pinyin1 = pinyin((char) codePoint1); // String pinyin2 = pinyin((char) codePoint2); // // if (pinyin1 != null && pinyin2 != null) { // 两个字符都是汉字 // if (!pinyin1.equals(pinyin2)) { // return pinyin1.compareTo(pinyin2); // } // } else { // return codePoint1 - codePoint2; // } // } // } // return o1.length() - o2.length(); // } public static void main(String[] args) { List<Person> list = new ArrayList<Person>(); Person p1 = new Person("张山",12,"123465789"); Person p2 = new Person("阿狗",12,"123465789"); Person p3 = new Person("李四",12,"123465789"); Person p4 = new Person("张山",12,"123465789"); Person p5 = new Person("李某某",12,"123465789"); Person p6 = new Person("阿某某",12,"123465789"); Person p7 = new Person("瞿某某",12,"123465789"); Person p8 = new Person("张某某",12,"123465789"); Person p9 = new Person("张价",12,"123456789"); list.add(p1); list.add(p2); list.add(p3); list.add(p4); list.add(p5); list.add(p6); list.add(p7); list.add(p8); list.add(p9); // Comparator c = new Person(); Collections.sort(list); for(int i=0;i<list.size();i++){ System.out.println(list.get(i).getName()); } } // public int compareTo(Person o) { // Comparator cmp = Collator.getInstance(java.util.Locale.CHINESE); // return cmp.compare(this.getName(), o.getName()); // } public int compareTo(Person o) { String o1=this.getName(); String o2 = o.getName(); for (int i = 0; i < o1.length() && i < o2.length(); i++) { int codePoint1 = o1.charAt(i); int codePoint2 = o2.charAt(i); if (Character.isSupplementaryCodePoint(codePoint1) || Character.isSupplementaryCodePoint(codePoint2)) { i++; } if (codePoint1 != codePoint2) { if (Character.isSupplementaryCodePoint(codePoint1) || Character.isSupplementaryCodePoint(codePoint2)) { return codePoint1 - codePoint2; } String pinyin1 = pinyin((char) codePoint1); String pinyin2 = pinyin((char) codePoint2); if (pinyin1 != null && pinyin2 != null) { // 两个字符都是汉字 if (!pinyin1.equals(pinyin2)) { return pinyin1.compareTo(pinyin2); } } else { return codePoint1 - codePoint2; } } } return o1.length() - o2.length(); } }