我有一个要求,我想检查 map 的值
与另一个 map 的值
是否匹配,我想获取 key
第一张 map
虚拟化 map
def virtua=[
"VMWARE" : "00:68:8B:",
"VMWARE" : "00:68:8A",
"COLINUX" : "00:18:8A:"
]
网络 map
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地址作为VMWARE<的 key
可以重复
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
最佳答案
映射中不能有重复的键(您有多个 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 }
编辑 -- key:list 示例
在评论中,有人问我有关将值作为列表的映射(以解决重复键问题)的问题;
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}"
}
关于java - 将 map 的值与 groovy 中的另一个 map 值进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8179712/