我不會使用Collator
,因爲您無法控制字符串的比較方式,因此無法控制它的Javadoc。您可以選擇語言環境,但該語言環境如何告知Collator
如何比較字符串不在您的手中。
如果您知道,在你的字符串中的字符都是ASCII字符,那麼我只使用String.compareTo()
方法,它的字典順序基於Unicode字符值。如果字符串中的所有字符都是ASCII字符,則它們的Unicode字符值將是它們的ASCII值,因此按照字典順序對其unicode值進行排序將與按字典順序對其ASCII值進行排序相同,這似乎是g_ascii_stcasecmp
所做的。如果您需要不區分大小寫,則可以使用String.compareToIgnoreCase()
。
正如我在評論中指出的,我認爲你需要編寫自己的比較函數。您需要遍歷字符串中的字符,跳過不在ASCII範圍內的字符。所以這樣的事情,這是一個簡單的,愚蠢的實現,需要加強了覆蓋角落情況下,我想象g_ascii_strcasecmp
作用:
public int compareStrings(String str) {
List<Character> myAsciiChars = onlyAsciiChars(this.wordString);
List<Character> theirAsciiChars = onlyAsciiChars(str);
if (myAsciiChars.size() > theirAsciiChars.size()) {
return 1;
}
else if (myAsciiChars.size() < theirAsciiChars.size()) {
return -1;
}
for (int i=0; i < myAsciiChars.size(); i++) {
if (myAsciiChars.get(i) > theirAsciiChars.get(i)) {
return 1;
}
else if (myAsciiChars.get(i) < theirAsciiChars.get(i)) {
return -1;
}
}
return 0;
}
private final static char MAX_ASCII_VALUE = 127; // (Or 255 if using extended ASCII)
private List<Character> onlyAsciiChars(String s) {
List<Character> asciiChars = new ArrayList<>();
for (char c : s.toCharArray()) {
if (c <= MAX_ASCII_VALUE) {
asciiChars.add(c);
}
}
return asciiChars;
}
我知道那裏有非ASCII字符。原始編碼是UTF-8,任何可能的字符都可以在那裏,如ò,ø,æ,î,ю,ж,ё。 – bancer
然後這將不起作用,因爲根據您的鏈接,執行比較時,'g_ascii_strcasecmp'忽略非ASCII字符。 'String.compareTo/compareToIgnoreCase'不會。我認爲你將不得不編寫你自己的比較函數。 – QuantumMechanic
非常感謝您的幫助。我認爲在'g_ascii_strcasecmp'中「處理所有非ASCII字節,就好像它們不是字母」,並不意味着非ASCII字符被忽略,而是被視爲字節(或類似字符)。我想我已經想出了該怎麼做。 – bancer