Java日语本地化排序如何将拉丁字符调整到排序结果末尾
Java日语混合字符串排序实现方案
默认Locale.JAPANESE对应的Collator排序规则会将拉丁字符优先级置于日文字符之前,仅靠原生Collator无法直接实现你的需求,可通过自定义双层比较逻辑实现,代码改动极小:
实现思路
- 第一层优先判断字符串首字符的所属字符集,将所有日文开头的内容排序优先级设为高于拉丁开头的内容
- 第二层对同一字符集的内容,依旧调用原生日语Collator保证本地化排序规则生效
完整代码示例
import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; public class JapaneseSort { // 判断字符串是否以日文字符开头(覆盖汉字、平假名、片假名、全角符号等日文场景) private static boolean isJapaneseStart(String str) { if (str == null || str.isEmpty()) return false; char firstChar = str.charAt(0); Character.UnicodeBlock block = Character.UnicodeBlock.of(firstChar); return block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || block == Character.UnicodeBlock.HIRAGANA || block == Character.UnicodeBlock.KATAKANA || block == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS; } public static void main(String[] args) { final Collator jpCollator = Collator.getInstance(Locale.JAPANESE); List<String> objects = new ArrayList<>(); objects.add("Alpha"); objects.add("家事問屋"); objects.add("ベータ"); objects.add("Beta"); Collections.sort(objects, (s1, s2) -> { boolean s1Jp = isJapaneseStart(s1); boolean s2Jp = isJapaneseStart(s2); // 日文内容优先排在前面 if (s1Jp && !s2Jp) return -1; if (!s1Jp && s2Jp) return 1; // 同类内容用原生日语排序规则 return jpCollator.compare(s1, s2); }); System.out.println(objects); } }
输出结果
运行上述代码后输出为:[家事問屋, ベータ, Alpha, Beta],完全符合需求。
内容的提问来源于stack exchange,提问作者Steffen Spranger
相关产品推荐
相关产品推荐

