2012-04-15 55 views
2

我有一个字符串列表,其中每个字符串可能由汉字或数字或英文字符组成。 (例如:“z莉z莉”,“露西”,“蒋豪”,“qwer”,“zoutiao”,“hah”)。我想要做的就是按照英文字母顺序排序,比如Android的Contacts应用程序(这是“hah”,“蒋豪”,“露西”,“qwer”,“z莉z莉”,“zout1iao”)所以我的策略是把所有的汉字转换成拼音,然后像往常一样进行比较。 我试过库yinpin4j,它在J2SE平台上运行良好,但是当我在Android上运行相同的代码时,它引发了一个错误。 的Java代码:如何在Android中排序中文?

@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); 它运作良好,只要有中国字。在上面的例子中,这种方法将分别分类中文和英文。

那么,你有什么想法吗?

+0

你想使用相同的方法排序中文和英文字符? – UVM 2012-04-15 05:01:35

+0

是的,将汉字转换成拼音,比他们可以用英文排序。 – Longerian 2012-04-15 05:41:45

+1

当你在java中对operartion进行排序时,它仅使用unicode。也就是说,根据用户的区域设置,自动调整.ex,如果中文用户可以看到排序的文本,如果他的电话区域设置为chinese.Also ,如果语言环境设置为英语,则默认情况下它将显示为排序。 – UVM 2012-04-15 06:08:44

回答

0

我的建议是,由码点,解析“字”码点,并建立一个新的字符串。如果下一个码点的拉丁/通用,不要调用words2Pinyin(),只需将聊天添加到新建的字符串。它是中文,叫单词拼音(),并将拼音添加到新字符串中。循环。最后,你有一个干净的拉丁字符串。

+0

谢谢你的建议。事实是,我建立了一个新的特定项目来运行该演示,并且它可以工作。但我仍然不知道如何发生错误。 – Longerian 2012-05-22 01:55:01

0

你可以在google罐子似乎pinyin.jar,它可以帮助你

+0

谢谢,我明白了。 – Longerian 2012-06-09 09:05:59

0

如果你是拉联系人从电话数据(如姓名,电话号码,电子邮件,...),尽量拉一个多列ContactsContract.Contacts.SORT_KEY_PRIMARY,它将显示名称的拼音和显示名称(如果有)一起存储。

比方说DISPLAY_NAME“阿妹”,其SORT_KEY_PRIMARY将是“阿梅妹”; “大姨”,排序是“DA大姨姨”。从那里你可以很容易地应用字母排序和地图到原来的显示名称。 :)

相关问题