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

Java中如何对LinkedHashMap内同频率键排序并保留原频率顺序

解决LinkedHashMap相同频率键排序且保留频率顺序的问题

刚好碰到过类似的场景,我来给你拆解下实现思路。你的需求核心是只对相同频率的单词做排序,但完全保留原map里不同频率之间的排列顺序,对吧?那我们可以分三步来搞定:

步骤1:按频率分组,保留原频率顺序

首先,我们需要把原LinkedHashMap里的条目按频率分组,而且要保证分组后频率的顺序和原map里的一致——这里关键是用LinkedHashMap来存储分组结果,这样分组的key(也就是频率值)就会严格遵循原map中频率出现的顺序。

代码示例:

import java.util.*;
import java.util.stream.Collectors;

// 假设你的原词频map已经构建好了
LinkedHashMap<String, Integer> wordFrequencyMap = new LinkedHashMap<>();
// 模拟测试数据:原顺序是频率从高到低:banana(3), apple(3), dog(2), cat(2), egg(1)
wordFrequencyMap.put("banana", 3);
wordFrequencyMap.put("apple", 3);
wordFrequencyMap.put("dog", 2);
wordFrequencyMap.put("cat", 2);
wordFrequencyMap.put("egg", 1);

// 按频率分组,保留频率的原顺序
Map<Integer, List<String>> frequencyGroups = wordFrequencyMap.entrySet().stream()
    .collect(Collectors.groupingBy(
        Map.Entry::getValue,
        LinkedHashMap::new, // 核心:用LinkedHashMap存分组,保证频率顺序和原map一致
        Collectors.mapping(Map.Entry::getKey, Collectors.toList())
    ));

步骤2:对每组内的单词排序

接下来,针对每个频率对应的单词列表,按照你需要的规则排序——比如默认的字母自然顺序,或者自定义规则(比如按单词长度排序)。

// 按自然字母顺序排序每组内的单词
frequencyGroups.values().forEach(Collections::sort);

// 如果想自定义排序逻辑,比如先按单词长度再按字母,就换成:
// frequencyGroups.values().forEach(list -> list.sort(Comparator.comparing(String::length).thenComparing(String::naturalOrder)));

步骤3:重新构建有序的LinkedHashMap

最后,我们按照原频率的顺序,把每个分组里排序后的单词依次放回新的LinkedHashMap,这样就得到了符合要求的结果:不同频率的顺序和原map完全一致,相同频率的单词是排好序的。

LinkedHashMap<String, Integer> sortedResult = new LinkedHashMap<>();
frequencyGroups.forEach((freq, sortedWords) -> {
    sortedWords.forEach(word -> sortedResult.put(word, freq));
});

// 输出验证:此时相同频率的单词会按排序后的顺序出现,频率顺序还是原map的3→2→1
sortedResult.forEach((word, freq) -> System.out.println(word + ": " + freq));

为什么这个方案可行?

  • 用LinkedHashMap存储分组,确保了频率的顺序和原map完全一致,不会打乱不同频率之间的排列。
  • 仅对每个频率组内部的单词做排序操作,不会影响其他频率的位置。
  • 最后重新构建的LinkedHashMap严格按照分组顺序(即原频率顺序)插入单词,完美匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:28:04