2015-10-05 93 views
1

我想查谁能够拿出最好的Groovy-SH的方式来实现这一目标 -Groovy中 - 加入过滤器映射

def m1 = [["id":"1","o":"11"],["id":"1","o":"12"],["id":"2","o":"21"]] 
def m2 = [["o":"11","t":"t1"],["o":"11","t":"t2"],["o":"21","t":"t1"]] 

我想导致

[["id":"1","t":"t1"],["id":"1","t":"t2"],["id":"2","t":"t1"]] 

我目前的迭代地图和做到这一点。我正在寻找一个解决方案,使用Gpath和findAll

谢谢, Sreehari。

回答

2

您可以transpose两份名单,并从每个列表中的条目(idt):

def fn = { m1, m2 -> 
    return [m1,m2] 
     .transpose() 
     .collect { [ id: it.first().id, t: it.last().t ] } 
} 


def m1 = [["id":"1","o":"11"],["id":"1","o":"12"],["id":"2","o":"21"]] 
def m2 = [["o":"11","t":"t1"],["o":"11","t":"t2"],["o":"21","t":"t1"]] 


assert fn(m1, m2) == 
     [["id":"1","t":"t1"],["id":"1","t":"t2"],["id":"2","t":"t1"]] 
0

可以使用转置到地图拉链成对,然后通过地图键结合对和过滤器:

[m1, m2] 
    .transpose() 
    .collect { (it[0] + it[1]).subMap(['id', 't']) } 

计算结果为

[[id:1, t:t1], [id:1, t:t2], [id:2, t:t1]] 

这适用于groovysh使用Groovy-2.4 .4,与jdk7或jdk8。

+0

谢谢,我应该尝试。什么是subMap? – sreehari

+0

@sreehari:按键过滤地图:http://mrhaki.blogspot.com/2009/10/groovy-goodness-getting-submap-from-map.html –

+0

我不能接受这个答案,因为它没有编译并产生如上所述的期望结果。 – sreehari