我有一张地图列表。我想检查是否有任何地图包含特定的键值对。
myKey = myValue
最Groovy的方法是什么?
答案 0 :(得分:6)
鉴于方法:
List findMaps( List<Map> m, Map pattern ) {
m.findAll { map -> pattern.findAll { k, v -> map[ k ] == v }.size() == pattern.size() }
}
然后你可以这样做:
def listOfMaps = [ [ a:1, b:2 ], [ a:3, b:4 ], [ a:5, b:2 ] ]
assert findMaps( listOfMaps, [ a:3 ] ) == [ [ a:3, b:4 ] ]
assert findMaps( listOfMaps, [ a:1, b:2 ] ) == [ [ a:1, b:2 ] ]
assert findMaps( listOfMaps, [ b:2 ] ) == [ [ a:1, b:2 ], [ a:5, b:2 ] ]
assert findMaps( listOfMaps, [ c:4 ] ) == []
可能会有更短的方式......我会考虑一下; - )
List findMaps( List<Map> m, Map pattern ) {
m.findAll { map -> map.subMap( pattern.keySet() ) == pattern }
}
- )
List findMaps( List<Map> m, Map pattern ) {
m.findAll{ map -> !( pattern - map ) }
}
答案 1 :(得分:2)
我想蒂姆正在寻找这个。 :)
List findMaps( List<Map> m, Map pattern ) {
m.findAll{map -> map.findResults{map.intersect(pattern) == pattern ? it : null}}
}
def listOfMaps = [ [ a:1, b:2 ], [ a:3, b:4 ], [ a:5, b:2 ] ]
assert findMaps( listOfMaps, [ a:3 ] ) == [ [ a:3, b:4 ] ]
assert findMaps( listOfMaps, [ a:1, b:2 ] ) == [ [ a:1, b:2 ] ]
assert findMaps( listOfMaps, [ b:2 ] ) == [ [ a:1, b:2 ], [ a:5, b:2 ] ]
assert findMaps( listOfMaps, [ c:4 ] ) == []
如果您只需要匹配任何条目而不是匹配整个地图,那么您可以放松模式与交集的匹配,让Groovy Truth完成它的工作:
List findMaps( List<Map> m, Map pattern ) {
m.findAll{ map -> map.findResults{ map.intersect(pattern) ? it : null } }
}
assert findMaps( listOfMaps, [ a:3 ] ) == [ [ a:3, b:4 ] ]
assert findMaps( listOfMaps, [ a:1, b:2 ] ) == [ [ a:1, b:2 ], [a:5, b:2] ]
assert findMaps( listOfMaps, [ b:2 ] ) == [ [ a:1, b:2 ], [ a:5, b:2 ] ]
assert findMaps( listOfMaps, [ c:4 ] ) == []
编辑:这是最短的:
List findMaps( List<Map> m, Map pattern ) {
m.findAll { map -> !( pattern - map ).intersect( pattern ) }
}
:d
<强>更新强>
很高兴看到蒂姆出现更短的版本。我只是简单地复制他的想法,并且声称我已经找到了shortessssstttttt代码。
List findMaps( List<Map> m, Map pattern ) {
m.findAll { !( pattern - it ) }
}
LOL
答案 2 :(得分:0)
map.each{key, value ->
if(key==myKey && value==myValue){
print key+"="+myValue
}
}