如何在安卓系统中对中文进行排序?

3

我有一个字符串列表,其中每个字符串可能包含中文字符、数字或英文字符。(例如:"z莉z莉"、"露西"、"蒋豪"、"qwer"、"zout1iao"、"hah")。我的目标是按照英文字母顺序对它们进行排序,就像Android的联系人应用程序一样。(即"hah"、"蒋豪"、"露西"、"qwer"、"z莉z莉"、"zout1iao")。因此,我的策略是将所有中文字符转换为拼音,然后像往常一样进行比较。 我尝试过yinpin4j库,在J2SE平台上运行良好,但在Android上运行相同的代码时,会引发错误。 Java代码如下:

@Override
public int compareTo(People another) {
    String onePinyin = HanziHelper.words2Pinyin(name);
String theOtherPinyin = HanziHelper.words2Pinyin(another.getName());
return onePinyin.compareTo(theOtherPinyin);
}

private static String char2String(char c) {
    StringBuilder sb = new StringBuilder();
    return sb.append(c).toString(); 
}

public static String char2Pinyin(char c) {
    String[] pinyin = null;
    try {
        pinyin = PinyinHelper.toHanyuPinyinStringArray(c, format);
    } catch(BadHanyuPinyinOutputFormatCombination e) {
        e.printStackTrace();
    }
    if(pinyin == null) {
        return char2String(c);
    } else {
        return pinyin[0];
    }
}

public static String words2Pinyin(String words) {
    StringBuilder sb = new StringBuilder();
    char[] chars = words.toCharArray();
    for(int i = 0, length = chars.length; i < length; i++) {
        sb.append(char2Pinyin(chars[i]));
    }
    return sb.toString();
}

错误信息为:

04-15 12:37:15.750: W/System.err(6898): java.io.IOException: BufferedInputStream is closed
04-15 12:37:15.791: W/System.err(6898):     at     java.io.BufferedInputStream.streamClosed(BufferedInputStream.java:116)
04-15 12:37:15.791: W/System.err(6898):     at java.io.BufferedInputStream.read(BufferedInputStream.java:294)
04-15 12:37:15.791: W/System.err(6898):     at java.io.InputStreamReader.read(InputStreamReader.java:255)
04-15 12:37:15.791: W/System.err(6898):     at java.io.BufferedReader.fillBuf(BufferedReader.java:128)
04-15 12:37:15.791: W/System.err(6898):     at java.io.BufferedReader.read(BufferedReader.java:236)
04-15 12:37:15.791: W/System.err(6898):     at java.util.Properties.load(Properties.java:307)
04-15 12:37:15.791: W/System.err(6898):     at java.util.Properties.load(Properties.java:266)
04-15 12:37:15.791: W/System.err(6898):     at net.sourceforge.pinyin4j.ChineseToPinyinResource.initializeResource(Unknown Source)
04-15 12:37:15.791: W/System.err(6898):     at net.sourceforge.pinyin4j.ChineseToPinyinResource.<init>(Unknown Source)
04-15 12:37:15.791: W/System.err(6898):     at net.sourceforge.pinyin4j.ChineseToPinyinResource.<init>(Unknown Source)
04-15 12:37:15.791: W/System.err(6898):     at net.sourceforge.pinyin4j.ChineseToPinyinResource$ChineseToPinyinResourceHolder.<clinit>(Unknown Source)
04-15 12:37:15.791: W/System.err(6898):     at net.sourceforge.pinyin4j.ChineseToPinyinResource.getInstance(Unknown Source)
04-15 12:37:15.796: W/System.err(6898):     at net.sourceforge.pinyin4j.PinyinHelper.getUnformattedHanyuPinyinStringArray(Unknown Source)
04-15 12:37:15.796: W/System.err(6898):     at net.sourceforge.pinyin4j.PinyinHelper.getFormattedHanyuPinyinStringArray(Unknown Source)
04-15 12:37:15.796: W/System.err(6898):     at net.sourceforge.pinyin4j.PinyinHelper.toHanyuPinyinStringArray(Unknown Source)
04-15 12:37:15.796: W/System.err(6898):     at com.sf.tools.HanziHelper.char2Pinyin(HanziHelper.java:29)
04-15 12:37:15.796: W/System.err(6898):     at com.sf.tools.HanziHelper.words2Pinyin(HanziHelper.java:44)
04-15 12:37:15.796: W/System.err(6898):     at com.sf.parse.PeopleListParser$Result$People.compareTo(PeopleListParser.java:156)
04-15 12:37:15.796: W/System.err(6898):     at com.sf.parse.PeopleListParser$Result$People.compareTo(PeopleListParser.java:1)
04-15 12:37:15.796: W/System.err(6898):     at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:286)
04-15 12:37:15.796: W/System.err(6898):     at java.util.ComparableTimSort.sort(ComparableTimSort.java:153)
04-15 12:37:15.796: W/System.err(6898):     at java.util.ComparableTimSort.sort(ComparableTimSort.java:142)
04-15 12:37:15.796: W/System.err(6898):     at java.util.Arrays.sort(Arrays.java:1974)
04-15 12:37:15.796: W/System.err(6898):     at java.util.Collections.sort(Collections.java:1941)
04-15 12:37:15.796: W/System.err(6898):     at com.sf.activity.PeopleListActivity.initPageView(PeopleListActivity.java:73)
04-15 12:37:15.796: W/System.err(6898):     at com.sf.activity.ReceiverListActivity.initPageView(ReceiverListActivity.java:23)
04-15 12:37:15.796: W/System.err(6898):     at com.yek.android.base.BaseActivity.onCreate(BaseActivity.java:158)

然后我改用了Collator usCollator = Collator.getInstance(Locale.SIMPLIFIED_CHINESE); usCollator.setStrength(Collator.PRIMARY);。如果只有中文字符,这个方法可以很好地工作。在上面的例子中,此方法将分别对中文和英文进行排序。

那么,你有什么想法吗?


你想使用相同的方法对中英文字母进行排序吗? - UVM
是的,将汉字转换成拼音后,它们可以与英文一起排序。 - Longerian
2
当您在Java中进行排序操作时,它仅使用Unicode。也就是说,根据用户的语言环境,自动进行调整。例如,如果中国用户将手机设置为中文,则可以查看已排序的文本。同样地,如果语言环境设置为英语,则默认情况下会显示为已排序。 - UVM
4个回答

0
如果您正在从手机中提取联系人数据(例如姓名、电话号码、电子邮件等),请尝试再提取一列ContactsContract.Contacts.SORT_KEY_PRIMARY,它将显示名称的拼音与显示名称(如果有)一起存储。
假设DISPLAY_NAME为“阿妹”,其SORT_KEY_PRIMARY将是“a 阿 MEI 妹”;“大姨”的排序键是“DA 大 YI 姨”。从那里,您可以轻松地应用字母排序并映射到原始显示名称。 :)

0
我的建议是,逐个解析“单词”代码点并构建一个新字符串。如果下一个代码点是拉丁语/通用字符,则不要调用words2Pinyin()函数,只需将该字符添加到新构建的字符串中。如果是中文,则调用words2Pinyin()函数并将拼音添加到新字符串中。循环执行此操作。最终你会得到一个干净的拉丁字符串。

谢谢您的建议。事实上,我创建了一个新的特定项目来运行该演示,并且它可以正常工作。但是,我仍然不知道那个错误是如何发生的。 - Longerian

0

0

你可以在谷歌上搜索一个叫做pinyin.jar的jar包,它可以帮助你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接