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

Java Stream按整数位数分组Map 实现值前缀添加与负数过滤

整数按位数分组的Stream实现方案

原有代码未覆盖过滤规则、类型转换、前缀拼接三个要求,可通过调整流处理逻辑+groupingBy下游收集器实现需求,具体实现如下。

正确代码

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public static Map<Integer, List<String>> groupByDigitNumbers(List<Integer> x){
    return x.stream()
            // 过滤所有负整数
            .filter(num -> num >= 0)
            .collect(Collectors.groupingBy(
                    // 分组键:原整数的数字位数
                    num -> Integer.toString(num).length(),
                    // 下游收集:转换为带奇偶前缀的字符串后收集为列表
                    Collectors.mapping(
                            num -> (num % 2 == 0 ? "e" : "o") + num,
                            Collectors.toList()
                    )
            ));
}

逻辑说明

  • 第一步通过filter操作直接剔除所有负整数,避免后续无效计算
  • 分组键直接取原整数转字符串后的长度,避免前缀拼接后长度计算错误
  • 借助Collectors.mapping作为groupingBy的下游收集器,在分组阶段直接完成整数到目标字符串的转换,直接得到List<String>类型的value,无需额外遍历转换
  • 奇偶判断通过取模运算实现:偶数拼接e前缀,奇数拼接o前缀

效果验证

传入示例输入[17,2,44,183,4]时,处理逻辑如下:

  • 17:奇数、2位 → 生成o17,归入key=2的分组
  • 2:偶数、1位 → 生成e2,归入key=1的分组
  • 44:偶数、2位 → 生成e44,归入key=2的分组
  • 183:奇数、3位 → 生成o183,归入key=3的分组
  • 4:偶数、1位 → 生成e4,归入key=1的分组
    最终输出和预期完全一致:{1: ["e2", "e4"], 2: ["o17", "e44"], 3: ["o183"]}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:15:39