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

Groovy groupBy可变键集合分组实现技术求助

解决Groovy按可变列集合分组的问题

我明白你想要实现一个能和Groovy原生groupBy多闭包调用效果完全一致的方法,用来根据可变的列名集合对数据集进行分层分组。让我来一步步帮你实现这个groupBySpecifiedCols方法。

首先,先明确原生groupBy({it.Sex}, {it.Age})的行为:它会生成一个嵌套的Map,第一层键是Sex的取值,每个键对应的值又是一个Map,第二层键是Age的取值,最终对应符合这两个条件的人员列表。我们的方法需要用列名列表来动态复现这个逻辑。

实现思路

核心思路是递归分层分组:

  • 每次处理列表中的第一个列,先按该列对当前数据集分组
  • 如果还有剩余的列,就对每个分组的子集递归调用方法,继续按剩下的列分组
  • 没有剩余列时,直接返回当前分组的子集

完整实现代码

把你的groupBySpecifiedCols方法替换成下面的代码:

def groupBySpecifiedCols(List<Map> data, List<String> columns){
    // 边界情况:没有指定列,直接返回原数据
    if(columns.isEmpty()) {
        return data
    }
    // 取出当前要分组的列,以及剩余的列
    String currentColumn = columns.first()
    List<String> remainingColumns = columns.drop(1)
    
    // 按当前列分组,然后对每个分组递归处理剩余列
    return data.groupBy { it[currentColumn] }.collectEntries { key, subset ->
        [key: remainingColumns ? groupBySpecifiedCols(subset, remainingColumns) : subset]
    }
}

代码解释

  1. 边界处理:当传入的列列表为空时,直接返回原数据集,和原生groupBy不传闭包的行为一致(不过你的测试用例里不会触发这个情况)。
  2. 分层分组:先用groupBy按当前列把数据分成多个子集,然后对每个子集判断是否还有剩余列:
    • 如果有剩余列,就递归调用groupBySpecifiedCols继续分组,生成下一层嵌套Map
    • 如果没有剩余列,就直接保留当前的子集列表

验证测试

把这个实现放到你的测试代码里,两个if判断都会返回false,最终会输出Success!,完全符合原生groupBy多闭包调用的结果。

另外要注意,如果数据中的某个Map缺少指定的列名,这个方法会把null作为分组键,这和Groovy原生groupBy的行为也是一致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:12:45