2012-04-15 7 views
2

私は文字列のリストを持っています。それぞれの文字列は、中国語や数字、英語の文字で構成されています。 (例:「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のみが使用されます。ユーザーのロケールによっては、自動的に調整されます。もしあなたの携帯電話のロケールがchinese.Alsoに設定されていれば、ロケールが英語に設定されている場合、デフォルトではソート済みとして表示されます。 – UVM

答えて

0

連絡先アプリは「COLLATE LOCALIZED ASC」を使用します。あなたは私のアドバイスは、可能コードポイントで「単語」のコードポイントを解析し、新しい文字列を構築します

What does COLLATE LOCALIZED ASC stand for?

0

同じことを試すことができます。次のコードポイントのLatin/Commonの場合、words2Pinyin()を呼び出さずに、新しく作成した文字列にチャットを追加します。それは中国語で、words2Pinyin()を呼び出し、ピンインを新しい文字列に追加します。ループ。最後に、きれいなラテン文字列があります。

+0

ありがとうございました。実際には、私はそのデモを実行するための新しい具体的なプロジェクトを立ち上げ、それが動作します。しかし、私はまだそのエラーがどのように発生するのか分からない。 – Longerian

0

あなたはjarファイルをグーグルことができますがpinyin.jar思わあなたが電話から連絡先データを引いている場合、それはあなたの

+0

ありがとう、私はそれを得た。 – Longerian

0

を助けることができる(例えば、名前、電話番号、電子メール、...)、1つの以上の列を引っ張ってみてくださいContactsContract.Contacts.SORT_KEY_PRIMARYの場合、表示名のピンインと表示名(存在する場合)を格納します。

たとえば、DISPLAY_NAME「阿妹」、そのSORT_KEY_PRIMARYは「阿MEI妹」、 "大姨"、ソートキーは "DA大YI姨"です。そこからアルファベットソートを簡単に適用し、元の表示名にマップすることができます。 :)

関連する問題