我有一个要求,如果它匹配的话,我想用另一个map's value检查map's value,我想得到第一张地图的key
虚拟化图
def virtua=[
"VMWARE" : "00:68:8B:",
"VMWARE" : "00:68:8A",
"COLINUX" : "00:18:8A:"
]网络地图
def network=[
"eth0":"00:68:8B:",
"eth1":"00:18:8A:",
"eth2":"00:68:8A:"
]因此,在匹配了来自network和virtua的值之后,我得到了下面的输出,如何在groovy中实现它呢?
eth0,00:68:8B:,VMWARE
eth1,00:18:8A:,COLINUX
eth2,00:68:8A:,VMWARE更新在@tim_yates & @Xaerxess应答之后,我认为最好使用MAC Addr作为密钥,因为VMWARE可以复制
def virtua1=[
"00:68:8B:" : "VMWARE",
"00:68:8A:" : "VMWARE",
"00:18:8A:" : "COLINUX"
]
def coll = network.collect { k, v ->
//[ k, v, virtua.find { a, b -> b == v }?.key ]
print "$k,$v,"
println virtua1.find{ a, b -> a == v }?.value
}输出
eth0,00:68:8B:,VMWARE
eth1,00:18:8A:,COLINUX
eth2,00:68:8A:,VMWARE发布于 2011-11-18 08:46:21
您不能在地图中有重复的键(您有多个VMWARE条目),并且您的网络变量是一个列表而不是一个映射.
纠正这些,并假设你的意思是:
def virtua=[
"VMWAREA" : "00:68:8B:",
"VMWAREB" : "00:68:8A:",
"COLINUX" : "00:18:8A:"
]
def network=[
"eth0":"00:68:8B:",
"eth1":"00:18:8A:",
"eth2":"00:68:8A:",
]你可以:
def coll = network.collect { k, v ->
[ k, v, virtua.find { a, b -> b == v }?.key ]
}给你一份清单:
[ ["eth0", "00:68:8B:", "VMWAREA"],
["eth1", "00:18:8A:", "COLINUX"],
["eth2", "00:68:8A:", "VMWAREB"] ]如果要将其打印为逗号分隔字符串,则只需:
coll*.join(',').each { println it }编辑--键:列表示例
在评论中,我被问到了一个将值作为列表的Map (为了绕过重复的关键问题);
def virtua=[
"VMWARE" : [ "00:68:8B:", "00:68:8A:" ],
"COLINUX" : [ "00:18:8A:" ]
]
def network=[
"eth0":"00:68:8B:",
"eth1":"00:18:8A:",
"eth2":"00:68:8A:",
]
network.each { k, v ->
println "$k,$v,${virtua.find { it.value.grep( v ) }?.key}"
}https://stackoverflow.com/questions/8179712
复制相似问题