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
相关产品推荐
相关产品推荐

