我有波斯语中的项目列表,我想按字母顺序对它们进行排序。
据我所知,java不支持正确的波斯语字母排序。
我的代码:
List<String> items = new ArrayList<>();
items.add("آب");
items.add("بابا");
items.add("تار");
items.add("پارک");
items.add("توت");
Collections.sort(items);
当我打印此列表时,结果将是:
آب
بابا
تار
توت
پارک
但它一定是这样的:
آب
بابا
پارک
تار
توت
问题在于这些字母گچپژ
我该如何解决?
答案 0 :(得分:4)
在你的问题的代码中,Java使用unicode命令对字符串进行排序,并且(我必须猜测)这对波斯语没有帮助。
要正确排序,您可以使用Java提供的Collator
功能。
Collator collator = Collator.getInstance(new Locale("fa", "IR"));
collator.setStrength(Collator.PRIMARY);
Collections.sort(items, collator);
我不知道波斯是否得到支持。
答案 1 :(得分:1)
不幸的是,这是一个旧的(自Java 1.4以来),但仍然没有解决增强请求。
请参阅错误报告JDK-6182989 - Collator should support the correct sort order for Persian。
但也许你可以复制那里给出的PersianCollator
的建议代码,然后像这样使用它:
Collections.sort(items, PersianCollator.persianCollator());
答案 2 :(得分:1)
此代码将给出预期结果:
@api.multi
def download_doc_one(self):
return {
'type': 'ir.actions.act_url',
'url': 'http://docs.python.org/library/webbrowser.html' #example url
'target': 'new',
}
仅按首字母排序。要通过其他字母订购,应相应地改进比较方法。
答案 3 :(得分:1)
不确定您使用的Java版本,但您可以使用简单的RuleBasedCollator来切换需要切换的少数字符的顺序(其余字符应遵循Unicode顺序)。 API文档中的类描述中有一个很好的例子。
还有complete example in the Java Tutorials显示如何使用您创建的RuleBasedCollator。
答案 4 :(得分:1)
万一其他解决方案(例如上述解决方案)在那儿无法使用,您可以使用此技巧,
static private String prepareForArabicSort(String text) {
return text
.replaceAll("ی", "ي")
.replaceAll("ک", "ك")
.replaceAll("گ", "كی")
.replaceAll("ژ", "زی")
.replaceAll("چ", "جی")
.replaceAll("پ", "بی");
}
Arrays.sort(list, (l, r) -> {
return prepareForArabicSort(l).compareTo(prepareForArabicSort(r);
});
答案 5 :(得分:0)
如果有对象的arrayList,则可以使用此方法
首先创建一个整理器:
val collator: Collator = Collator.getInstance(Locale("fa", "IR"))
collator.strength = Collator.PRIMARY
然后通过sortedBy这样列出您的列表:
val sortList = items.sortedWith(compareBy (collator){ it.name})
该项目是您的对象的arrayList,它是您的比较器