java - 在 Java 中对多语言环境字符串进行排序

标签 java sorting unicode localization

我正在尝试按字符串字段“国家/地区”对对象列表进行排序。每个国家都使用它的母语

  • 阿根廷
  • 澳大利亚
  • Österreich
  • ελλάδα
  • България ...

  • 我想要做的是让“България”出现在“A*”国家之后,因为字母“Б”对应于拉丁语“B”。我正在尝试使用默认的 Collat​​er,但非拉丁名称仍排在列表的最后。

    到目前为止,这是我的代码:
    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 正在尝试做的事情。
    选择的一个是拉丁字母,其他字母必须转换为这个字母。
    问题是这种类型转换通常是模棱两可的。很容易我们只能转换大部分俄语或希腊字母。
    更大的问题是阿拉伯语或亚洲语言。我们应该记住,当从一种字母转换到另一种字母时,我们经常会丢失一些东西。

    那么我们如何进行这样的排序呢?
  • 第一个建议是手动为每个国家/地区提供拉丁名称。所以我们会有一个包含对的列表,例如
  • Россия Rossija
  • ελλάδα 埃拉达
    然后我们可以按拉丁名称和显示名称排序。
  • 第二种方法是运行与此类似的代码:

  • 代码:
    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 将是在所有以 O 开头的国家之后。
    但在正常化之后,Österreich 将成为 Osterreich,并将位于安大略和渥太华之间。
    (我知道安大略和渥太华不是国家。这只是示例)。
  • 如果有人来自日本并且不会拉丁字母,那么这种排序对他来说毫无用处。他将不得不浏览所有列表,直到找到他的国家。
  • 让我们假设有一个国家 Волгоград(Wolgograd),并且这个国家的公民只知道俄语字母。
    在俄语字母表中,В 是第三个字母,因此当 Волгоград 接近列表末尾(靠近委内瑞拉)时,此人将在列表的开头(比利时和丹麦之间的某个位置)进行搜索。
    所以在这种情况下,排序不仅没有帮助,而且会产生误导。
  • 如果有人知道拉丁字母并且正在寻找他的国家,那么这并不容易。
    当所有国家/地区都用英语命名并且我正在寻找“波兰”时,我总是知道我应该上升还是下降。如果我看到“日本”,我就知道要列入名单。当我看到“俄罗斯”时,我就知道要上去了。
    但是,如果我们对所有这些名称进行排序,那么可能会出现问题。如果我看到 ايران 那么我将无法决定是上升还是下降。
    所以在这个例子中排序没有帮助。更糟糕的情况是当我在列表中遇到 Волгоград 时。我不知道俄语字母表,我会假设我接近“B”字母,而实际上我已经接近列表的末尾了。
    那我就选错方向了。

  • 摘要:

    对用不同语言编写的国名进行排序很难定义和实现。当实现时,它要么没有帮助,要么有害。

    关于java - 在 Java 中对多语言环境字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4203299/

    相关文章:

    java - 如何在vijava中获取vm权限

    JavaMail 通过具有 SSO 身份验证的 Exchange 服务器

    Java代码给出ORA-12514错误,但我可以通过外部程序连接

    java - Java中的比较器问题

    c++ - qDebug() 在 Windows 上不支持 unicode 字符串

    java - 在控制台上的两点之间画线

    JAVA HashSet 顺序

    java - 尝试按字母顺序对对象数组进行排序,但对象无法转换为字符串

    python - 如何对齐列的 Unicode 类型值?

    javascript - Angular 绑定(bind)中的 Unicode 字符