我在 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 中是否有更好的解决方案?
请注意,如果这可能相关,则属性在所有情况下都是相同的并且是提前知道的。
我认为除了“比较地图”之外,您没有更多可以做的事情;这最多只能用于测试,短路是一种选择。或者您可以使用可以构建差异的库。
也就是说,您的代码有所改进。
从 开始
h1
意味着,您不会发现仅在 中的键有差异h2
(例如交换h1
和h2
将从keys3
结果中消失)。因此,找到所有相关键集的并集将解决这个问题(请参阅compareMaps
、def keys
)。接下来,如果您平等对待以下内容,您可以非常积极地比较最终的布尔值:
null
(参见中的闭包
compareMapValues
)例如