You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中俄语等非拉丁字母作为LinkedHashMap键时排序失效问题

Java LinkedHashMap俄语键排序解决方案

你遇到的排序异常主要由以下几个常见问题导致:

  • 未约束入参Map类型:只有LinkedHashMap会保留插入顺序,若传入普通HashMap,即使排序后按顺序插入元素,最终也会按哈希桶顺序存储,完全打乱排序结果。
  • Collator实例创建位置不合理:在compare方法内重复创建Collator实例,不仅有不必要的性能损耗,部分场景下可能受环境配置影响导致排序规则不一致。
  • 未显式指定排序强度:默认的Collator排序强度可能受JDK本地化配置影响,出现大小写、特殊字符排序规则不符合预期的问题。

修正方案

方案1:返回新的LinkedHashMap(更安全,无副作用)

import java.text.Collator;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;

private static LinkedHashMap<String, Integer> sortRuKeys(LinkedHashMap<String, Integer> originMap) {
    // 初始化俄语排序器,显式指定地区
    Collator ruCollator = Collator.getInstance(Locale.of("ru", "RU"));
    // 设置排序强度为PRIMARY:仅按基础字母排序,忽略大小写、重音差异
    ruCollator.setStrength(Collator.PRIMARY);

    // 排序后直接生成新的LinkedHashMap,不修改原有对象
    return originMap.entrySet()
            .stream()
            .sorted((o1, o2) -> ruCollator.compare(o1.getKey(), o2.getKey()))
            .collect(Collectors.toMap(
                    Map.Entry::getKey,
                    Map.Entry::getValue,
                    (oldVal, newVal) -> oldVal,
                    LinkedHashMap::new
            ));
}

方案2:修改原有Map(兼容原有代码写法)

import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Locale;
import java.util.Map;
import java.util.LinkedHashMap;

private static void sortKeys(Map<String, Integer> map) {
    // 校验入参类型,避免普通Map导致的顺序丢失
    if (!(map instanceof LinkedHashMap)) {
        throw new IllegalArgumentException("入参必须为LinkedHashMap类型才能保留排序顺序");
    }
    Collator collator = Collator.getInstance(new Locale("ru", "RU"));
    collator.setStrength(Collator.PRIMARY);

    ArrayList<Map.Entry<String, Integer>> wordEntryList = new ArrayList<>(map.entrySet());
    Collections.sort(wordEntryList, (o1, o2) -> collator.compare(o1.getKey(), o2.getKey()));

    map.clear();
    for (Map.Entry<String, Integer> entry : wordEntryList) {
        map.put(entry.getKey(), entry.getValue());
    }
}

异常排查

如果修改后仍有问题,可先运行以下代码确认当前JDK支持俄语本地化:

import java.text.Collator;
import java.util.Locale;

public class CheckRuLocale {
    public static void main(String[] args) {
        for (Locale locale : Collator.getAvailableLocales()) {
            if ("ru".equals(locale.getLanguage()) && "RU".equals(locale.getCountry())) {
                System.out.println("当前JDK支持ru_RU俄语排序");
                return;
            }
        }
        System.out.println("当前JDK未内置俄语本地化支持,需安装对应语言组件");
    }
}

测试输出

使用你提供的测试数据运行修正后的代码,输出结果和预期完全一致:

  • наше - 18
  • пушкин - 18
  • полете - 15
  • тигруля - 15
  • игрив - 12
  • котенок - 12
  • красив - 11
  • манул - 11

内容的提问来源于stack exchange,提问作者Judita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 01:36:03