如何修正Java Stream字符统计代码以生成指定格式的输出?
修正及优化方案
原代码存在两个核心问题:
- 用
System.out.println逐个打印键值对,导致结果分行显示,无法拼接成目标字符串 - 所有字符的计数都会被输出,包括计数为1的情况,不符合"计数为1时不显示数字"的要求
下面是修正后的完整代码:
String input1 = "abbccd"; String result = input1.chars() .mapToObj(c -> Character.toLowerCase((char) c)) // 简化字符转小写的写法 .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting())) .entrySet().stream() .map(entry -> { char key = entry.getKey(); long count = entry.getValue(); // 计数为1时只保留字符,否则拼接字符和计数 return count == 1 ? String.valueOf(key) : key + String.valueOf(count); }) .collect(Collectors.joining()); // 将所有片段拼接成一个字符串 System.out.println(result); // 输出:ab2c2d
关键优化点说明:
- 简化字符处理:把
Character.toLowerCase(Character.valueOf((char) s))改成Character.toLowerCase((char) c),直接对char类型转小写,避免多余的装箱操作 - 替换输出逻辑:用
map操作处理每个键值对,根据计数决定输出内容,再通过Collectors.joining()把所有片段拼接成完整字符串,替代原有的forEach逐个打印 - 保留顺序:继续使用
LinkedHashMap确保字符顺序和原字符串一致
内容的提问来源于stack exchange,提问作者sid
相关产品推荐
相关产品推荐

