2

それぞれが漢字、数字、または英字で構成されている可能性のある文字列のリストがあります。(例: 「z莉z莉」、「露西」、「蒋豪」、「qwer」、「zout1iao」、「はっ」)。私がやりたいのは、Androidの連絡先アプリのように英語のアルファベット順に並べ替えることです.戦略は、すべての漢字をピンインに変換してから、通常どおり比較することです。ライブラリ 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); 漢字さえあればうまくいきます。上記の例では、このメソッドは中国語と英語を別々にソートします。

それで、何かアイデアはありますか?

4

4 に答える 4

0

私のアドバイスは、「ワード」コードポイントをコードポイントごとに解析し、新しい文字列を作成することです。次のコードポイントがLatin/Commonの場合は、words2Pinyin()を呼び出さずに、新しく作成された文字列にチャットを追加するだけです。中国語です。words2Pinyin()を呼び出して、新しい文字列に拼音を追加します。ループ。最後に、きれいなラテン弦ができます。

于 2012-05-21T12:54:46.783 に答える
0

連絡先アプリは「COLLATELOCALIZEDASC」を使用しています。あなたは同じことを試すことができます

COLLATE LOCALIZED ASCは何の略ですか?

于 2012-04-15T06:09:20.647 に答える
0

電話から連絡先データ (名前、電話番号、電子メールなど) を取得している場合は、もう 1 つの列を取得してみてください。ContactsContract.Contacts.SORT_KEY_PRIMARY表示名のピンインと表示名 (存在する場合) が一緒に格納されます。

DISPLAY_NAME「阿妹」としましょう、それSORT_KEY_PRIMARYは「阿MEI妹」になります。「大姨」、ソートキーは「DA 大YI 姨」です。そこから、アルファベットの並べ替えとマップを元の表示名に簡単に適用できます。:)

于 2015-10-28T11:21:55.610 に答える
0

jar をググると pinyin.jar のように見えます。

于 2012-06-06T08:20:51.133 に答える