java - 在日语排序中将拉丁字符排序到末尾
问题描述
我想对日文字符串进行排序(可能包含各种日文字符以及拉丁字符),拉丁字符应该排序到最后。
final Collator collator = Collator.getInstance(Locale.JAPANESE);
List<String> objcts = new ArrayList<>();
objcts.add("Alpha");
objcts.add("家事問屋");
Collections.sort(objcts, collator);
System.out.println(objcts);
出:[Alpha,家事问屋]
期望输出:[家事问屋,Alpha]
有没有一种简单的方法可以实现这一目标?
解决方案
可能您可以使用这样的正则表达式来实现Comparator
或扩展在CJK之前对拉丁语Collator
进行排名:
public class LatinBeforeCJKCollator implements Comparator<String> {
private final Collator collator;
public LatinBeforeCJKCollator(Collator collator) {
this.collator = collator;
}
@Override
public int compare(String source, String target) {
if (source.matches("[\\p{IsHiragana}\\p{IsKatakana}\\p{IsHan}]+") && target.matches("\\p{IsLatin}+")) {
return -1;
}
if (source.matches("\\p{IsLatin}+") && target.matches("[\\p{IsHiragana}\\p{IsKatakana}\\p{IsHan}]+")) {
return 1;
}
return collator.compare(source, target);
}
}
我从这个问题的答案中使用了 Unicode 字符集: 如何检测 Java 字符串中的日语文本?
您可能需要根据需要自定义匹配(例如,所有字母都是拉丁字母,第一个字母是拉丁字母等)。
像这样使用时:
final Comparator comparator = new LatinBeforeCJKCollator(Collator.getInstance(Locale.JAPANESE);
List<String> strings = List.of("Alpha", "Beta", "問屋", "家事問屋");
System.out.println(strings.stream().sorted(collator).collect(Collectors.joining(",")));
然后输出将显示如下排序:
家事问屋,问屋,Alpha,Beta
推荐阅读
- data-science - 十六进制表示如何与字长匹配?
- matplotlib - mplcanvas中的甜甜圈饼图
- android - Wordpress Respond.io 网络聊天小部件在 Android 上无法正常工作
- pytorch - 如何使用 fastai 保存的模型?
- excel - 具有匹配工作表名称和多个条件的 VBA 复制和粘贴数据
- android - 参数类型“String”不能分配给参数类型“bool”
- angular - 如何使用 Angular 2 + 拦截 Oboe js api 请求
- javascript - 从需要使用 R/Rvest 登录的 javascript 网站抓取
- javascript - 关于 javascript 事件及其工作原理
- list - 使用列表迭代的子图标题