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
相关产品推荐
相关产品推荐

