eme*_*ieu 12 java collation string-comparison
我有这个代码.它用法语和俄语正确排序.我使用Locale.US,它似乎是正确的.这个解决方案适用于所有语言吗?它适用于其他语言吗?例如:中国人,韩国人,日本人......如果没有,有什么更好的解决方案?
public class CollationTest {
public static void main(final String[] args) {
final Collator collator = Collator.getInstance(Locale.US);
final SortedSet<String> set = new TreeSet<String>(collator);
set.add("abîmer");
set.add("abîmé");
set.add("aberrer");
set.add("abhorrer");
set.add("aberrance");
set.add("abécédaire");
set.add("abducteur");
set.add("abdomen");
set.add("??????????????-?????????????????");
set.add("???????");
set.add("????????");
set.add("?????????????");
set.add("???????");
set.add("???????");
set.add("???????");
set.add("???????");
for(final String s : set) {
System.out.println(s);
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新: 对不起,我不要求这个集合必须包含所有语言.我的意思是这个集包含一种语言,并在每种语言中正确排序.
public class CollationTest {
public static void main(final String[] args) {
final Collator collator = Collator.getInstance(Locale.US);
final SortedSet<String> set = new TreeSet<String>(collator);
// Sorting in French.
set.clear();
set.add("abîmer");
set.add("abîmé");
set.add("aberrer");
set.add("abhorrer");
set.add("aberrance");
set.add("abécédaire");
set.add("abducteur");
set.add("abdomen");
for(final String s : set) {
System.out.println(s);
}
// Sorting in Russian.
set.clear();
set.add("??????????????-?????????????????");
set.add("???????");
set.add("????????");
set.add("?????????????");
set.add("???????");
set.add("???????");
set.add("???????");
set.add("???????");
for(final String s : set) {
System.out.println(s);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Cem*_*emo 24
因为每种语言都有自己的字母顺序,所以你不能.例如,
如你所说的俄语有?字母与土耳其语有不同的顺序.
你应该总是使用collator.我建议你的是我们的Collection API.
//
// Define a collator for German language
//
Collator collator = Collator.getInstance(Locale.GERMAN);
//
// Sort the list using Collator
//
Collections.sort(words, collator);
Run Code Online (Sandbox Code Playgroud)
获得进一步的信息查询和说明这里
此程序显示当您使用两个不同的collators对相同的单词列表进行排序时会发生什么:
Collator fr_FRCollator = Collator.getInstance(new Locale("fr","FR"));
Collator en_USCollator = Collator.getInstance(new Locale("en","US"));
用于排序的方法(称为sortStrings)可以与任何Collator一起使用.请注意,sortStrings方法调用compare方法:
public static void sortStrings(Collator collator,
String[] words) {
String tmp;
for (int i = 0; i < words.length; i++) {
for (int j = i + 1; j < words.length; j++) {
if (collator.compare(words[i], words[j]) > 0) {
tmp = words[i];
words[i] = words[j];
words[j] = tmp;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
英国Collator对单词进行排序如下:
peachpéchépêche罪
根据法语的整理规则,前面的列表顺序错误.在法语中,péché应该在排序列表中跟随pêche.French Collator正确地对单词数组进行排序,如下所示:
peachpêchepéchésin
一二三*_*一二三 10
即使您可以准确地检测所使用的语言,有用的整理顺序通常也特定于特定语言+国家/地区组合.即使在语言+国家/地区内,整理也可能因使用情况或某些自定义而异.
但是,如果您确实需要对任意文本集进行排序,最好的选择是Unicode排序算法,它为任何Unicode文本定义了与语言无关的排序规则.该算法是可定制的,但没有必要给出对任何一种文化都有意义的结果(绝对不能跨越它们).
Java的校对类不实现此算法,但它可作为ICU的RuleBaseCollator的一部分使用.
| 归档时间: |
|
| 查看次数: |
9456 次 |
| 最近记录: |