在 Java 中对阿拉伯语单词进行排序

2023-11-24

我有一个阿拉伯语单词列表,我想对其进行排序。我已经尝试了具有不同语言环境的标准 Collat​​or(例如英语或法语,但没有太大希望),我什至创建了自己的 RuleBasedCollat​​or 但无济于事。显然,默认排序依赖于 unicode 值顺序,这在许多情况下都有效,但显然在本例中不起作用。

按照 javadoc 的说明,RuleBasedCollat​​or 需要一个字符串,按照您希望的排序顺序指定字符。我创建了以下字符串,从中获取 unicode 代码这张桌子:

String arabicLetters = "< \u0623=\uFE83=\uFE84 < \u0628=\uFE8F=\uFE90=\uFE92=\uFE91 < \u062A=\uFE95=\uFE96=\uFE98=\uFE97 < \u062B=\uFE99=\uFE9A=\uFE9C=\uFE9B < \u062C=\uFE9D=\uFE9E=\uFEA0=\uFE9F < \u062D=\uFEA1=\uFEA2=\uFEA4=\uFEA3 < \u062E=\uFEA5=\uFEA6=\uFEA8=\uFEA7 < \u062F=\uFEA9=\uFEAA < \u0630=\uFEAB=\uFEAC < \u0631=\uFEAD=\uFEAE < \u0632=\uFEAF=\uFEB0 < \u0633=\uFEB1=\uFEB2=\uFEB4=\uFEB3 < \u0634=\uFEB5=\uFEB6=\uFEB8=\uFEB7 < \u0635=\uFEB9=\uFEBA=\uFEBC=\uFEBB < \u0636=\uFEBD=\uFEBE=\uFEC0=\uFEBF < \u0637=\uFEC1=\uFEC2=\uFEC4=\uFEC3 < \u0638=\uFEC5=\uFEC6=\uFEC8=\uFEC7 < \u0639=\uFEC9=\uFECA=\uFECC=\uFECB < \u063A=\uFECD=\uFECE=\uFED0=\uFECF < \u0641=\uFED1=\uFED2=\uFED4=\uFED3 < \u0642=\uFED5=\uFED6=\uFED8=\uFED7 < \u0643=\uFED9=\uFEDA=\uFEDC=\uFEDB < \u0644=\uFEDD=\uFEDE=\uFED0=\uFEDF < \u0645=\uFEE1=\uFEE2=\uFEE4=\uFEE3 < \u0646=\uFEE5=\uFEE6=\uFEE8=\uFEE7 < \u0647=\uFEE9=\uFEEA=\uFEEC=\uFEEB < \u0648=\uFEED=\uFEEE < \u064A=\uFEF1=\uFEF2=\uFEF4=\uFEF3 < \u0622=\uFE81=\uFE82 < \u0629=\uFE93=\uFE94 < \u0649=\uFEEF=\uFEF0 < \u0627";

阿拉伯字母可以采用四种形式,具体取决于它们在单词中的位置。因此,我在上面的规则字符串中所做的就是使每个字母的所有 4 种形式都相等。然后我用“

现在,如果我有一个包含星期几的集合(在这种情况下按星期几排序,而不是“按字母顺序”):

الأَحَد, الاِثنَين, الثُّلاثاء, الأَربِعاء, الخَميس, الجُمعة,السَّبت

我得到的结果根本没有排序:

الأَحَد, الخَميس, الاِثنَين, الثُّلاثاء, الأَربِعاء, السَّبت, الجُمعة

此外,对于如此少量的单词,需要花费相当长的时间,这使得它无法使用。

有人知道我是否做错了什么,或者是否有一个救生库已经处理了这个问题?

在写这篇文章之前我做了一些谷歌搜索,令我惊讶的是我没有找到任何结果。

Thanks!


用代码更新:

public static class TranslatableComparator implements java.util.Comparator<Translatable> {
        @Override
        public int compare(Translatable t1, Translatable t2) {

            String sortingRules = "< \u0623=\uFE83=\uFE84 < \u0628=\uFE8F=\uFE90=\uFE92=\uFE91 < \u062A=\uFE95=\uFE96=\uFE98=\uFE97 < \u062B=\uFE99=\uFE9A=\uFE9C=\uFE9B < \u062C=\uFE9D=\uFE9E=\uFEA0=\uFE9F < \u062D=\uFEA1=\uFEA2=\uFEA4=\uFEA3 < \u062E=\uFEA5=\uFEA6=\uFEA8=\uFEA7 < \u062F=\uFEA9=\uFEAA < \u0630=\uFEAB=\uFEAC < \u0631=\uFEAD=\uFEAE < \u0632=\uFEAF=\uFEB0 < \u0633=\uFEB1=\uFEB2=\uFEB4=\uFEB3 < \u0634=\uFEB5=\uFEB6=\uFEB8=\uFEB7 < \u0635=\uFEB9=\uFEBA=\uFEBC=\uFEBB < \u0636=\uFEBD=\uFEBE=\uFEC0=\uFEBF < \u0637=\uFEC1=\uFEC2=\uFEC4=\uFEC3 < \u0638=\uFEC5=\uFEC6=\uFEC8=\uFEC7 < \u0639=\uFEC9=\uFECA=\uFECC=\uFECB < \u063A=\uFECD=\uFECE=\uFED0=\uFECF < \u0641=\uFED1=\uFED2=\uFED4=\uFED3 < \u0642=\uFED5=\uFED6=\uFED8=\uFED7 < \u0643=\uFED9=\uFEDA=\uFEDC=\uFEDB < \u0644=\uFEDD=\uFEDE=\uFED0=\uFEDF < \u0645=\uFEE1=\uFEE2=\uFEE4=\uFEE3 < \u0646=\uFEE5=\uFEE6=\uFEE8=\uFEE7 < \u0647=\uFEE9=\uFEEA=\uFEEC=\uFEEB < \u0648=\uFEED=\uFEEE < \u064A=\uFEF1=\uFEF2=\uFEF4=\uFEF3 < \u0622=\uFE81=\uFE82 < \u0629=\uFE93=\uFE94 < \u0649=\uFEEF=\uFEF0 < \u0627";
            RuleBasedCollator col = null;
            try {
                col = new RuleBasedCollator(sortingRules);
            } catch (ParseException e) {
                //col = (RuleBasedCollator)RuleBasedCollator.getInstance(Locale.FRENCH);
            }

            return col.getCollationKey(t1.getTranslation().getText()).compareTo(col.getCollationKey(t2.getTranslation().getText()));
        }
    }

您不需要定义自己的整理器,只需使用内置的阿拉伯语整理器即可。你的Comparator然后看起来像这样

public int compare(Translatable t1, Translatable t2) {
        Collator.getInstance(new Locale("ar")).compare(t1.getTranslation().getText(), t2.getTranslation().getText());
}

(您可以通过浏览以下结果来检查是否有可用于阿拉伯语的整理器Collator.getAvailableLocales().)

正如评论中所述,如果您担心性能,您应该计算排序规则键,将它们存储在您的Translatable对象并对其进行排序。

如果您确实想查看您定义的内容与标准整理器之间的差异,只需打印出规则:

System.out.println((RuleBasedCollator) Collator.getInstance(new Locale("ar"))).getRules();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中对阿拉伯语单词进行排序 的相关文章

随机推荐

  • 与 suPHP 一起实现登录

    如何设计类似登录的功能来使用 suPHP 的文件权限 例如 如果我有一个网站www example com以下两个用户有自己的主目录 每个用户都有一个 php 脚本test php and a validateUser php属于另一个用户
  • 在 MediaProjection 中完全隐藏安全视图 - android

    我正在使用 MediaProjection API 创建屏幕录像机应用程序 在我的应用程序中 我将停止按钮显示为一个小的覆盖窗口 我已将此视图保持安全 以便它不会出现在最终录制的视频中 此视图不会出现在最终视频中 但最终输出本身是一个黑色区
  • 使用服务主体访问 Azure Blob 存储

    我想通过使用活动目录服务主体的凭据从 python 访问私有 blob 存储 我知道这个相关问题如何在 python 中针对 Azure 存储 blob 对用户进行身份验证 这帮助我走到了这一步 但现在我陷入了困境 我可以进行身份 验证并获
  • 将结构传递给函数

    我是一名新 C 程序员 我想知道如何通过struct到一个函数 我收到错误并且无法找出正确的语法来执行此操作 这是它的代码 Struct struct student char firstname 30 char surname 30 st
  • Docker 撰写可执行文件在 $PATH 中找不到”:未知

    但我有问题 Dockerfile FROM python 3 ENV PYTHONUNBUFFERED 0 RUN mkdir code WORKDIR code COPY requirements txt code RUN pip ins
  • 使用 powershell 从 Outlook 获取今天的约会:不需要的结果

    我使用以下代码提取今天的约会 olFolderCalendar 9 ol New Object ComObject Outlook Application ns ol GetNamespace MAPI Start Get Date Add
  • switch 语句 - 字符串与 int

    我在事件处理程序中有这行 javascript var value event currentTarget value example 9 然后我在 switch 语句中使用它 switch value case 9 return 12 c
  • 计算设置的位数

    我想计算设置的二进制数中的位数 例如 用户输入数字 97 二进制表示为 01100001 该程序应该告诉我 3 位是使用 MIPS ISA 设置的 我能够用 C 实现这一点 但我不知道如何使用汇编代码实现它 您要查找的内容通常称为人口计数
  • WPF图像控件源码

    我试图在 WPF 中重新创建一个非常简单的 C 项目示例 它是一个简单的图像查看器 来自 sam 的自学 C 我设法打开了打开文件对话框 但是我如何将图像路径设置为WPF 中的 image source 控件 private void Se
  • 异步任务与异步无效

    这可能是一个非常愚蠢的问题 但我有以下几行代码将 RAW 图像转换为 BitmapImages public async void CreateImageThumbnails string imagePath int imgId await
  • 如何在 Windows 上使用另一个用户帐户创建新进程?

    是否可以使用不同的用户帐户在 Windows 上创建新进程 我知道有一个上下文菜单 运行方式 但我想从 Java 执行此操作 我有用户名和密码 您需要使用以下方法编写 DLLJava 本机接口 JNI 因为你无法使用纯 Java 代码来做到
  • 将 Nokogiri 文档转换为 Ruby Hash

    有没有一种简单的方法可以将 Nokogiri XML 文档转换为哈希值 类似于 Rails 的东西Hash from xml 如果要将 Nokogiri XML 文档转换为哈希 只需执行以下操作 require active support
  • 如何在jquery中启用和禁用文本框[重复]

    这个问题在这里已经有答案了 我写了一个html和脚本的示例代码如下 当我首先执行此代码时 我会收到警报 hello 但当我通过按选项卡按钮在 cca 进行更改时 会收到其他警报 然后它不会显示警报 如何使用该文本框并启用和禁用它的其他文本字
  • 如何将 DataTable 序列化为 json 或 xml

    我正在尝试将 DataTable 序列化为 Json 或 XML 可能吗 如何 任何教程和想法 请 例如有一个sql表 CREATE TABLE dbo dictTable keyValue int IDENTITY 1 1 NOT NUL
  • 如何在 Swift 中比较两个字典?

    有没有一种简单的方法可以比较两个 String AnyObject Swift 中的字典 因为它不接受 操作员 通过比较两个字典 我的意思是检查它们是否具有相同的精确键 并且对于每个键 它们是否具有相同的值 正如 Hot Licks 已经提
  • 计算垂直于 3D 中第三个向量的两个向量

    是什么最好 最快 如何计算垂直于第三个向量 X 并且彼此垂直的两个向量 这就是我现在计算这个向量的方式 HELPER unit vector that is NOT parallel to X x axis normalize X y ax
  • Python 多处理导致许多僵尸进程

    我一直在使用一组工作人员来实现 python 的多处理库 我实现了以下代码 import main1 t1 time time p Pool cores result p map main1 client list client if re
  • Python 列表作为变量名称[重复]

    这个问题在这里已经有答案了 我一直在使用 Python 并且我有这个需要制定的列表 基本上 我在多维数组中输入一个游戏列表 然后对于每个游戏 它将根据第一个条目创建 3 个变量 制作的数组 Applist Apple red circle
  • AutoHotkey 中的功能键叫什么?

    I have a key labelled Fn in blue letters at the bottom of my Windows 7 keyboard I want to trigger my AutoHotkey script w
  • 在 Java 中对阿拉伯语单词进行排序

    我有一个阿拉伯语单词列表 我想对其进行排序 我已经尝试了具有不同语言环境的标准 Collat or 例如英语或法语 但没有太大希望 我什至创建了自己的 RuleBasedCollat or 但无济于事 显然 默认排序依赖于 unicode