私は文字列のリストを持っています。それぞれの文字列は、中国語や数字、英語の文字で構成されています。 (例:「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);
を使用するように変更。上記の例では、このメソッドは中国語と英語を別々にソートします。
だから、アイデアはありますか?
中国語と英語の文字を同じ方法でソートしますか? – UVM
はい、英語で一緒に並べ替えることができるよりも、中国語の文字をピンインに変換してください。 – Longerian
Javaでオペレーションをソートすると、Unicodeのみが使用されます。ユーザーのロケールによっては、自動的に調整されます。もしあなたの携帯電話のロケールがchinese.Alsoに設定されていれば、ロケールが英語に設定されている場合、デフォルトではソート済みとして表示されます。 – UVM