今天上水木发现有人问怎样对汉字字符串按照拼音排序,查了一遍文档,发现java缺省对字符串是按照Unicode排序的。接着查到(要是没有了Google,世界将会怎样?)有一个java.text.Collator类,但是论坛上有人说这个类没用,和缺省的排序效果一样,要用C#写一个类生成java程序。这要是真的,那还学java干嘛?
  于是把别人的Test.java改了改,分别用指定的Locale和不指定Locale试了试,结果都是OK的: import java.util.*; import java.text.*; 
public class Test2 {  public static void  main(String args[]) {   //Comparator cmp = (RuleBasedCollator)java.text.Collator.getInstance(java.util.Locale.CHINA);//try testing various locales   Comparator cmp = java.text.Collator.getInstance(java.util.Locale.CHINA);//try testing various locales      String[] arr = {"ÕÂÈý", "Àï˹", "ÍõÎå", "Ñî¹óåú"};   java.util.Arrays.sort(arr, cmp);   for (int i = 0; i < arr.length; i++)     System.out.println(arr[i]); 
  Comparator cmp2 = java.text.Collator.getInstance();//try default locale      String[] arr2 = {"ÕÂÈý", "Àï˹", "ÍõÎå", "Ñî¹óåú"};   java.util.Arrays.sort(arr2, cmp2);   for (int i = 0; i < arr2.length; i++)     System.out.println(arr2[i]); 
 } }
  看来Java还不是那么查嘛。至于那位老兄,估计是缺省的Locale有问题。
  下面是Jive上Gg到的对字符串中的字符按照拼音排序的测试代码: import java.util.*; import java.io.*; import java.text.*; public class CharSort implements Comparator{  java.text.RuleBasedCollator collator; // you can set your rules for the instance "collator"  CharSort(){     collator = (RuleBasedCollator)java.text.Collator.getInstance(java.util.Locale.CHINA);//try testing various locales  } 
  public void doSort(String str) throws java.io.IOException{   java.text.CollationKey[] keys = new java.text.CollationKey[str.length()];   for(int i=0;i<keys.length;i++){        keys[i] = collator.getCollationKey(str.substring(i,i+1));   }   java.util.Arrays.sort(keys, this);     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("cjk.txt"), "UTF8"));   for(int i=0;i<keys.length;i++){           bw.write(keys[i].getSourceString());   }   bw.newLine();   bw.close();  }    public int compare(Object c1, Object c2) throws IllegalArgumentException{       if((c1 instanceof CollationKey) &&(c2 instanceof CollationKey)){           return collator.compare(((CollationKey)c1).getSourceString(), ((CollationKey)c2).getSourceString());       }       else throw new IllegalArgumentException();    }    public boolean equals(Object c1, Object c2){       if(this.compare(c1,c2)==0) return true;       else return false;  } 
 public static void main(String[] args) throws java.lang.Exception{   CharSort chSort = new CharSort();   String str = " ÎÒ¾õµÃÎÒÍê³ÉÕâ¸öûÓõ½Ê²Ã´¹¤¾ß";   chSort.doSort(str);   //System.out.println(str);      String[] arr = {"ÕÂÈý", "Àï˹", "ÍõÎå"};   java.util.Arrays.sort(arr, new CharSort());   for (int i = 0; i < arr.length; i++)     System.out.println(arr[i]);     } }  
 
  |