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


比如有如下数组:


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

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


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

我定义了如下的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.");
}
}
}

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

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;
}

我尝试使用了 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.");
}
}
}

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

如果不知道拼音,只用汉字我想是比较难以实现的

搞定了!感觉就是Java的国际化做的真是差啊!DOTNET里实现的很完美。

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

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

不能这么说吧,我觉得是因为.net的工具好些:)

我觉得我完成这个没用到什么工具。DOTNET的类库实现的很好,确实能让程序员专心于实现自己的业务逻辑,而不用再去考虑实现底层的东东。JDK还做不到这一点。就比如说汉字排序的问题,其实很简单,Java里也已经有了相应的Collator类,但是就没去很好的实现。也许对英语语言实现的不错吧,对中文为什么就不实现呢?

我查了一遍文档,在Java里面是可以实现的,也不需要自己写程序:

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 = (RuleBasedCollator)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);
}
}

import java.text.Collator;
import java.util.Comparator;

public class StringASC implements Comparator<String> {

@Override
public int compare(String o1, String o2) {
return Collator.getInstance(java.util.Locale.CHINA).compare(o1, o2);
}
}