当前位置: 首页 > 面试题库 >

用Java排序阿拉伯语单词

轩辕炎彬
2023-03-14
问题内容

我有一个要排序的阿拉伯语单词列表。我曾尝试使用不同的语言环境(例如英语或法语,但希望不高)使用标准的Collat​​or,甚至创建了自己的RuleBasedCollat​​or,但无济于事。显然,默认排序依赖于unicode值顺序,该顺序在许多情况下都有效,但显然不适用于此顺序。

按照javadocs的说明,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种形式均等。然后,我用“
<”表示字母的顺序。我认为这是正确的方法。

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

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

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

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

此外,对于如此少量的单词,需要花费大量时间,这使其无法使用。

有人知道我做错什么了吗,或者是否有可以解决这个问题的救生库?

在写这篇文章之前,我做了一些谷歌搜索,但很惊讶我没有找到一个结果。

谢谢!

用代码更新:

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();


 类似资料:
  • 问题内容: 我正在评估NLTK处理阿拉伯文本的能力,这项研究旨在分析和提取情感。 问题如下: NTLK是否可以处理并允许分析阿拉伯文本? python是否能够操纵\标记阿拉伯文本? 我可以使用Python解析和存储阿拉伯文本吗? 如果python和NTLK不是完成这项工作的工具,那么您会推荐哪些工具(如果存在)? 谢谢。 编辑 根据研究: NTLK仅能阻止阿拉伯文本:链接 Python支持UTF-

  • 我在从网络编码阿拉伯语响应时遇到问题,我正在使用volley调用网络服务 我试图解决这个问题。 我创建了自定义请求,然后在我登录时使用utf-8编码解析网络响应,以检查结果。这给了我奇怪的文字,这里是我的日志{“data”:null,“msg”:“ÙÙÙÙÙˆØØØØØØØØØØØØØØØØØØØØØØØØØ21所有尝试均失败。 谢谢你的帮助谢谢

  • 问题内容: 尝试将 阿拉伯 文字保存在可编辑的PDF中。它对 英语语言来说 都可以正常工作,但是当我使用阿拉伯语单词时,出现了这个异常: java.lang.IllegalArgumentException:U + 0627在此字体Helvetica编码中不可用:WinAnsiEncoding 这是我生成PDF的方式: 问题答案: 这就是我的工作方式,希望对其他人有所帮助。只需使用要在PDF中使用

  • 试图将阿拉伯语单词保存在可编辑的PDF中。它在英语单词中都很好用,但当我使用阿拉伯语单词时,我得到了一个例外:

  • 问题内容: 我有一个Java应用程序,想要将阿拉伯语单词插入mysql数据库,我的代码看起来像 但是它只插入’??????’。我现在能做什么? 问题答案: 在db变量声明后添加此变量: 然后修改您的行: 至

  • 在基于web的应用程序中,我们希望更改fa_IR区域设置中的数字格式。(波斯语和阿拉伯语数字的Unicode不同于拉丁语数字)。java不支持此特性(对于基于swing的应用程序,可以使用形状数字http://docs.oracle.com/javase/tutorial/i18n/text/shapeddigits.html) 无论如何,这个格式化程序将用unicode波斯语数字替换ASCII数