如何用Java Streams找出给定Map输入中的重复字符
使用Java Stream找出Map中每个字符串的重复字符
问题描述
给定以下Java Map:
Map<Integer,String> res1 = new HashMap<>(); res1.put(1, "NaaveeKKn"); res1.put(2, "lavanayana");
需要通过Stream流处理,提取每个字符串中的重复字符,得到预期输出:[[a,e,K],[a,n]]。
解决方案
核心逻辑是对Map中的每个字符串单独处理:通过分组统计字符出现次数,筛选出重复字符后收集为列表,最后汇总所有结果。
完整代码实现
import java.util.*; import java.util.stream.Collectors; public class DuplicateCharExtractor { public static void main(String[] args) { Map<Integer,String> res1 = new HashMap<>(); res1.put(1, "NaaveeKKn"); res1.put(2, "lavanayana"); List<List<Character>> duplicateCharsList = res1.values().stream() // 处理每个字符串 .map(str -> str.chars() // 将int类型的字符码转换为Character对象 .mapToObj(c -> (char) c) // 按字符分组,统计出现次数 .collect(Collectors.groupingBy(Character::charValue, Collectors.counting())) // 筛选出现次数≥2的字符 .entrySet().stream() .filter(entry -> entry.getValue() >= 2) .map(Map.Entry::getKey) // 收集为单个字符串的重复字符列表 .collect(Collectors.toList())) // 收集所有字符串的结果为最终列表 .collect(Collectors.toList()); System.out.println(duplicateCharsList); // 输出:[[a, e, K], [a, n]] } }
代码关键点说明
res1.values().stream():遍历Map中所有的字符串值,开启Stream处理str.chars().mapToObj(c -> (char) c):将字符串拆分为字符流,注意chars()返回的是Unicode码的int值,需要转换为Character对象Collectors.groupingBy(Character::charValue, Collectors.counting()):按字符本身分组,统计每个字符的出现次数,得到Map<Character, Long>filter(entry -> entry.getValue() >= 2):过滤出出现次数≥2的字符,即重复字符- 两层
collect(Collectors.toList()):先将单个字符串的重复字符收集为列表,再将所有列表汇总成最终结果
可选扩展:忽略大小写
如果需要忽略大小写(比如把N和n视为同一个字符),可以修改分组的key为统一大小写:
.collect(Collectors.groupingBy(c -> Character.toLowerCase(c), Collectors.counting()))
此时第一个字符串的重复字符会变为[a, e, k, n],可根据需求选择是否启用。
内容的提问来源于stack exchange,提问作者M.NAVEEN KUMAR
相关产品推荐
相关产品推荐

