Java里实现中文字符串数组的音序排序有没有现成的?

03-10-31 manbaum

比如有如下数组:

String[] names = new String[]
  {"张三", "李四", "王大麻子", "赵六", "钱七", "孙八斗"};
<p>

希望用 Arrays.sort() 排序后变成:

String[] sortedNames = new String[]
  {"李四", "钱七", "孙八斗", "王大麻子", "张三", "赵六"};
<p>

我定义了如下的Comparator,但是不符合要求:

pubilc class MyComparator
  implements Comparator
{
  public int compare(Object o1, Object o2)
  {
    if (o1 instanceof String && o2 instanceof String)
    {
      return ((String)o1).compareTo(o2);
    }
    else
    {
      throw new ClassCastException("Not two strings.");
    }
  }
}
<p>

顺便说一句,我检查了我的 Locale.getDefault(), 结果是 "zh_CN"。

JDonkey
2003-10-31 09:18
String类型的compareTo方法比较的只是字符的Unicode。有如下代码为证:

/**
     * Compares two strings lexicographically.
     * The comparison is based on the Unicode value of each  *character in
     * the strings.
......

*/
    public int compareTo(String anotherString) {
	int len1 = count;
	int len2 = anotherString.count;
	int n = Math.min(len1, len2);
	char v1[] = value;
	char v2[] = anotherString.value;
	int i = offset;
	int j = anotherString.offset;

	if (i == j) {
	    int k = i;
	    int lim = n + i;
	    while (k < lim) {
		char c1 = v1[k];
		char c2 = v2[k];
		if (c1 != c2) {
		    return c1 - c2;
		}
		k++;
	    }
	} else {
	    while (n-- != 0) {
		char c1 = v1[i++];
		char c2 = v2[j++];
		if (c1 != c2) {
		    return c1 - c2;
		}
	    }
	}
	return len1 - len2;
    }

<p>

manbaum
2003-10-31 09:26
我尝试使用了 Collator, 如下:

public MyComparator
  implements Comparator
{
  private static Collator _collator = Collator.getInstance();
  public int compare(Object o1, Object o2)
  {
    if (o1 instanceof String && o2 instanceof String)
    {
      return _collator.compare((String)o1, (String)o2);
    }
    else
    {
      throw new ClassCastException("Not two strings.");
    }
  }
}
<p>

结果和不使用 Collator 是一样的,我试用了 Collator.getInstance(Locale.CHINA),结果还是一样的。

Swallor
2003-10-31 10:42
如果不知道拼音,只用汉字我想是比较难以实现的

manbaum
2003-11-01 13:15
搞定了!感觉就是Java的国际化做的真是差啊!DOTNET里实现的很完美。

我用C#.NET写了个小程序,把GBK所有字符按音序排序后,生成一小段Java程序源码,把排序结果放在Java字符串里。

在Java里,根据此字符串做了个Comparator进行排序。

猜你喜欢
2Go 1 2 下一页