2012-04-15 5 views
2

У меня есть список String, каждый из которых может состоять из китайского символа или номера или английского персонажа. (Например: «z 莉 z 莉», «露西», «蒋 豪», «qwer», «zout1iao», «hah»). То, что я хочу сделать, это сортировать их по английскому алфавитному заказу, например, в приложении для контактов Android (это «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

+0

Да, перевод китайского иероглифа на пиньинь, чем они могут быть сортированы по-английски вместе. – Longerian

+1

, когда вы выполняете сортировку в java, он использует только unicode. Это говорит о том, что в зависимости от локали пользователя автоматически это настраивается. If, если китайский пользователь может видеть отсортированный текст, если его язык телефона установлен на китайский. Также , если языковой стандарт установлен на английский, то по умолчанию он будет отображаться как отсортированный. – UVM

ответ

0

Мой совет будет, разобрать «слово» элемент кода на элемент кода и построить новую строку. Если следующий латинский/общий код codepoint, не вызывайте слова2Pinyin() и просто добавляйте чат к недавно построенной строке. Это китайский, назовите слова2Pinyin() и добавьте пиньинь в новую строку. Loop. В конце у вас есть чистая, латинская строка.

+0

Благодарим вас за советы. Дело в том, что я создал новый конкретный проект для запуска этой демонстрации, и он работает. Но я до сих пор не знаю, как эта ошибка возникает. – Longerian

0

вы можете Google банку кажется pinyin.jar, это может помочь вам

+0

спасибо, я понял. – Longerian

0

Если вы тянете данные контактов с телефона (например, имя, номер телефона, адрес электронной почты, ...), попробуйте потянуть еще один столбец ContactsContract.Contacts.SORT_KEY_PRIMARY, он сохраняет пиньинь отображаемого имени вместе с отображаемым именем (если есть).

Скажем, DISPLAY_NAME «阿妹», его SORT_KEY_PRIMARY будет «a 阿 MEI 妹»; «大姨», ключ сортировки - «DA 大 YI 姨». Оттуда вы можете легко применить сортировку алфавита и отобразить исходное отображаемое имя. :)