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

Groovy中两个哈希表的高性能比较优化方案问询

问题描述

需要在Groovy中比较两个嵌套哈希表,示例输入如下:

h1 = [key1 : [att1 : 1, att2 : 2], key2 : [att1 : 10, att2 : 20], key3 : [att1 : 3, att2 : 4]]
h2 = [key1 : [att1 : 1, att2 : 3], key2 : [att1 : 10, att2 : 20]]

期望输出结果:

[key1:[att1:true, att2:false], key2:[att1:true, att2:true], key3:[att1:false, att2:false]]

规则是:给定键的属性匹配则标记为true,不匹配或在第二个哈希表中缺失则标记为false。

原实现使用嵌套闭包,代码如下:

diff = h1.collectEntries {key, value -> [key,  (value.collectEntries {k, v -> [k, (v == (h2[key] ? h2[key][k] : null) ) ] } ) ] }

该实现可正常运行,但处理大规模哈希表时性能不佳。已知所有条目的属性一致且提前知晓,求更高效的Groovy实现方案。

高效实现方案

既然已知所有条目属性一致且提前知晓,我们可以通过预先固定属性列表、减少重复查找等方式优化性能,以下是两种高效实现:

闭包优化版

// 提前定义好固定的属性列表
def attributes = ['att1', 'att2']

def diff = h1.collectEntries { key, h1Values ->
    // 外层一次性获取h2中对应key的value,不存在则用空map
    def h2Values = h2[key] ?: [:]
    [key, attributes.collectEntries { attr ->
        [attr, h1Values[attr] == h2Values[attr]]
    }]
}

优化点

  • 预先固定属性列表:避免每次遍历h1的value时动态获取属性集合,减少不必要的集合操作
  • 减少哈希表重复查找:外层循环一次性获取h2对应key的value,内层直接复用该变量,避免多次h2[key]的哈希表查询
  • 简化判断逻辑:当h2无对应key或属性时,h2Values[attr]为null,直接和h1的值比较自然得到false,逻辑简洁高效

普通循环版(超大规模数据首选)

如果处理的哈希表规模极大,可直接用普通for循环替代闭包,进一步降低闭包调用的额外开销:

def attributes = ['att1', 'att2']
def diff = [:]

for (entry in h1) {
    def key = entry.key
    def h1Values = entry.value
    def h2Values = h2[key] ?: [:]
    def attrMap = [:]
    
    for (attr in attributes) {
        attrMap[attr] = h1Values[attr] == h2Values[attr]
    }
    
    diff[key] = attrMap
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:52:41