我正在尝试按字符串字段“country”对对象列表进行排序。每个国家都使用其母语
我想要做的是例如“България”出现在“A *”国家之后,因为字母“Б”对应于拉丁语“B”。我正在尝试使用默认的Collater,但非拉丁名称仍然列在最后列表中。
到目前为止,这是我的代码:
private static final Comparator<DomainTO> DOMAIN_COUNTRY_COMPARATOR =
new Comparator<DomainTO>() {
@Override
public int compare(DomainTO t, DomainTO t1) {
Collator defaultCollator = Collator.getInstance();
return defaultCollator.compare(t.getCountry(), t1.getCountry());
}
};
答案 0 :(得分:34)
如何对来自不同语言的单词进行排序?有许多字母表(英语,俄语,德语等)。
每个人都订购了一系列信件。对来自一个字母表的单词进行排序很容易。但是有可能将所有这些字母合并成一个吗?
我认为不可能以一种可以被所有人接受的方式来实现。以英语和俄语字母为例。
俄语字母可以转换成英文字母(至少大部分都是这样)但是在这个演员之后他们会改变顺序。
这将有利于一个字母表而不是另一个字母表。为什么不给俄语写英文字母?
另一个问题是有特殊字母。在德语中,O和P之间有Ö,波兰语中有Ó在这个地方。
所以我们有以下关系:
O < Ö < P
O < Ó < P
但是Ö和Ó之间的关系是什么?如果有一个国家Ósterreich它应该是或Österreich之后? 因此,不可能定义从不同语言中排序单词的通用规则。
我们所能做的就是将所有字母表投射到所选字母表中。这就是OP正在努力做的事 所选择的是拉丁字母,其他字母必须输入到这个字母表中。 问题是这种铸造通常是模棱两可的。很容易我们只能投出大部分俄语或希腊语字母 更大的问题是阿拉伯语或亚洲语言。我们应该记住,当从一个字母表转换到另一个字母表时,我们经常会丢失一些
那么我们怎么做这样的排序呢?
代码:
char [] russian = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщ".toCharArray();
char [] russian_to = "AaBbWwGgDdEeEeZzZzIiJjKkLlMmNnOoPpRrSsTtUuFfHhCcCcSsss".toCharArray();
for (int i = 0; i < russian.length; i++) {
input = input.replace(russian[i], russian_to[i]);
}
这样我们就转换了俄语字母表中的所有字母。现在我们必须为其他字母添加类似的代码。而俄语是最简单的 但是假设我们成功了,我们设法对世界上所有语言进行了这样的排序 但是进行这种分类的后果是什么?在我们回答这个问题之前,让我们问一下这样做的目的是什么。 OP没有说出他做这种排序的原因。但我们可以推断它:
让我们回答这个问题:这种排序是否更容易找到只知道他母语的人的特定国家?
<强>要点:强>
对以不同语言编写的国家/地区名称进行排序很难定义和实施。实施后,它将无用或有害。
答案 1 :(得分:2)
也许您可以比较规范化的字符串。像这样:
private static final Comparator<DomainTO> DOMAIN_COUNTRY_COMPARATOR =
new Comparator<DomainTO>() {
private String normalize(final String input) {
return Normalizer
.normalize(input, Normalizer.Form.NFD)
.replaceAll("[^\\p{ASCII}]", "");
}
@Override
public int compare(final DomainTO t, final DomainTO t1) {
return normalize(t.getCountry()).compareTo(
normalize(t1.getCountry()));
}
};
请参阅有关规范化的相关问题:Converting Java String to ascii(此问题与几个类似的问题相关联)