2012-04-15 6 views
2

Ich habe eine Liste von String, die jeder von ihnen besteht aus chinesischen Zeichen oder Nummer oder englischen Zeichen. (Zum Beispiel: "z 莉 z 莉", "露西", "蒋 豪", "qwer", "zout1iao", "hah"). Was ich tun möchte, ist sie in Englisch Alphabet Reihenfolge wie Android Kontakte App zu sortieren. (Das ist "hah", "蒋 豪", "露西", "qwer", "z 莉 z 莉", "zout1iao") Also konvertiert meine Strategie alle chinesischen Schriftzeichen in Pinyin und vergleicht sie dann wie üblich. Ich habe versucht, Bibliothek yinpin4j, es funktioniert gut auf J2SE-Plattform, aber wenn ich den gleichen Code auf Android ausführen, hat es einen Fehler ausgelöst. der Java-Code ist:Wie sortiere ich Chinesisch in 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(); 
} 

Fehler ist:

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) 

Dann änderte ich Collator usCollator = Collator.getInstance(Locale.SIMPLIFIED_CHINESE); usCollator.setStrength(Collator.PRIMARY); Es funktioniert gut zu verwenden, wenn nur gibt es chinesische Schriftzeichen. Im obigen Beispiel sortiert diese Methode Chinesisch und Englisch getrennt.

Also, hast du irgendwelche Ideen?

+0

Möchten Sie chinesische und englische Zeichen mit derselben Methode sortieren? – UVM

+0

ja, chinesische Schriftzeichen in Pinyin konvertieren, als sie mit Englisch zusammen sortieren könnten. – Longerian

+1

Wenn Sie die Operation in Java sortieren, wird nur Unicode verwendet. Je nach Gebietsschema des Benutzers wird dies automatisch angepasst.ex, wenn chinesische Benutzer sortierten Text sehen können, wenn sein Gebietsschema des Telefons auf chinesisch eingestellt ist Wenn das Gebietsschema auf Englisch eingestellt ist, wird es standardmäßig als sortiert angezeigt. – UVM

Antwort

0

Mein Rat eine neue Zeichenfolge, analysieren das „Wort“ Codepunkt von Codepunkt und bauen wäre. Wenn der nächste Codepoint Latin/Common ist, rufe words2Pinyin() nicht auf und füge einfach den Chat zur neu erstellten Zeichenkette hinzu. Es ist Chinesisch, rufe words2Pinyin() auf und füge das Pinyin zur neuen Zeichenkette hinzu. Schleife. Am Ende hast du eine saubere, lateinische Saite.

+0

Vielen Dank für Ihren Rat. Tatsache ist, dass ich ein neues spezifisches Projekt eingerichtet habe, um diese Demo zu starten, und es funktioniert. Aber ich weiß immer noch nicht, wie dieser Fehler auftritt. – Longerian

0

Sie ein Glas google kann, scheint pinyin.jar, kann es Ihnen

+0

danke, ich habe es. – Longerian

0

helfen Wenn Sie Kontakte Daten von Telefon ziehen (zB Name, Telefonnummer, E-Mail, ...), versuchen Sie eine weitere Spalte ziehen ContactsContract.Contacts.SORT_KEY_PRIMARY, speichert es den Pinyin des Anzeigenamens zusammen mit dem Anzeigenamen (falls vorhanden).

Sagen wir DISPLAY_NAME "阿妹", seine SORT_KEY_PRIMARY wird "a 阿 MEI 妹" sein; "大姨", der Sortierschlüssel ist "DA 大 YI 姨". Von dort aus können Sie ganz einfach die alphabetische Sortierung und Zuordnung zum ursprünglichen Anzeigenamen vornehmen. :)