我正在尝试按字符串字段“国家/地区”对对象列表进行排序。每个国家都使用它的母语
我想要做的是让“България”出现在“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());
}
};
最佳答案
如何对来自不同语言的单词进行排序?有许多字母表(英语、俄语、德语等)。
每个人都有有序的字母列表。对来自一个字母表的单词进行排序很容易。但是有可能将所有这些字母合并为一个吗?
我认为不可能以所有人都能接受的方式来做。以英语和俄语字母为例。
俄语字母可以转换为英文字母(至少是大部分),但是在转换之后他们会改变顺序。
这将有利于一种字母表而不是另一种字母表。为什么不将英文字母转换为俄语?
另一个问题是有特殊字母。在德语中,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没有说明他进行这种排序的原因。但我们可以推断:
那么让我们回答这个问题:这种排序是否能让只知道自己母语的人更容易找到特定的国家?
但在正常化之后,Österreich 将成为 Osterreich,并将位于安大略和渥太华之间。
(我知道安大略和渥太华不是国家。这只是示例)。
在俄语字母表中,В 是第三个字母,因此当 Волгоград 接近列表末尾(靠近委内瑞拉)时,此人将在列表的开头(比利时和丹麦之间的某个位置)进行搜索。
所以在这种情况下,排序不仅没有帮助,而且会产生误导。
当所有国家/地区都用英语命名并且我正在寻找“波兰”时,我总是知道我应该上升还是下降。如果我看到“日本”,我就知道要列入名单。当我看到“俄罗斯”时,我就知道要上去了。
但是,如果我们对所有这些名称进行排序,那么可能会出现问题。如果我看到 ايران 那么我将无法决定是上升还是下降。
所以在这个例子中排序没有帮助。更糟糕的情况是当我在列表中遇到 Волгоград 时。我不知道俄语字母表,我会假设我接近“B”字母,而实际上我已经接近列表的末尾了。
那我就选错方向了。
摘要:
对用不同语言编写的国名进行排序很难定义和实现。当实现时,它要么没有帮助,要么有害。
关于java - 在 Java 中对多语言环境字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4203299/