首页 > 解决方案 > 在日语排序中将拉丁字符排序到末尾

问题描述

我想对日文字符串进行排序(可能包含各种日文字符以及拉丁字符),拉丁字符应该排序到最后。

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]

有没有一种简单的方法可以实现这一目标?

标签: java

解决方案


可能您可以使用这样的正则表达式来实现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


推荐阅读