如何实现按单词首字符映射至对应单词列表的Map?
实现按单词首字符分组的Map方案
嘿,这个需求其实挺常见的,我给你两种实用的实现方式,适配不同的Java版本,你可以按需选择:
方法一:传统循环迭代(Java 8及之前版本适用)
这种方式逻辑直观,适合所有Java版本。核心思路就是遍历每个单词,提取首字符作为键,然后维护对应的单词列表:
import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; public class WordGrouping { public static void main(String[] args) { // 给定的单词列表 List<String> words = Arrays.asList("albert", "ben", "alice", "cecilia"); // 初始化你定义的Map Map<String, List<String>> bigMap = new HashMap<>(); for (String word : words) { // 提取单词的首字符并转为字符串(因为Map的键是String类型) String firstChar = String.valueOf(word.charAt(0)); // 检查Map中是否已存在该首字符对应的列表,不存在则新建一个 if (!bigMap.containsKey(firstChar)) { bigMap.put(firstChar, new ArrayList<>()); } // 将当前单词添加到对应的列表中 bigMap.get(firstChar).add(word); } // 打印预期格式的结果 System.out.println(bigMap); } }
运行后输出就是你要的:{a=[albert, alice], b=[ben], c=[cecilia]}
方法二:Java 8+ Stream API(简洁高效)
如果你的项目用的是Java 8或更高版本,用Stream的groupingBy收集器能一行搞定分组,代码更简洁:
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class WordGroupingStream { public static void main(String[] args) { List<String> words = Arrays.asList("albert", "ben", "alice", "cecilia"); // 一行完成分组逻辑 Map<String, List<String>> bigMap = words.stream() .collect(Collectors.groupingBy(word -> String.valueOf(word.charAt(0)))); System.out.println(bigMap); } }
额外注意事项
- 空字符串处理:如果单词列表里可能存在空字符串,
word.charAt(0)会抛出StringIndexOutOfBoundsException,可以加个判断跳过空值:for (String word : words) { if (word.isEmpty()) continue; // 后续逻辑不变 } - 大小写兼容:如果需要忽略首字母大小写(比如"Albert"和"albert"分到同一组),可以把首字符转成小写/大写:
String firstChar = String.valueOf(word.charAt(0)).toLowerCase(); - 有序输出:如果希望Map的键按字母顺序排列,可以用
TreeMap代替HashMap,初始化时改成:Map<String, List<String>> bigMap = new TreeMap<>();
内容的提问来源于stack exchange,提问作者3xploit
相关产品推荐
相关产品推荐

