Java 比较地图';s值与groovy中的另一个映射值
我有一个要求,我想用另一个Java 比较地图';s值与groovy中的另一个映射值,java,groovy,Java,Groovy,我有一个要求,我想用另一个地图的值检查地图的值,如果它匹配,我想得到第一个地图的键 虚拟化映射 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"
地图的值检查地图的值
,如果它匹配,我想得到第一个地图的键
虚拟化映射
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:"
]
因此,在匹配了网络
和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
映射中不能有重复的键(您有多个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 }
编辑--键:列表示例
在评论中,我被问及一个以值为列表的映射(以避免重复键问题)
映射中不能有重复的键(您有多个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 }
编辑--键:列表示例
在评论中,我被问及一个以值为列表的映射(以避免重复键问题)
如果在两个映射中都使用MAC地址作为键,则会更容易(顺便说一句:网络
是一个列表,而不是映射)。@Xaerxess:Oh!我不好,network
是一个映射:)也假设MAC addr是键,你能给我举个例子吗?如果你在两个映射中都使用MAC地址作为键,会更容易些(顺便说一句:network
是一个列表,而不是映射)。@Xaerxess:Oh!我的错,network
是一张地图:)也假设MAC地址是关键,你能给我举个例子吗?我的错,这是问题中的一个输入错误,在我的程序中,我正在生成networkmap
它给了我00:68:8B:00:68:8B:00:68:8A 00:18:8A:00:68:8B:00:68:8A 00:18:8A:
@Ricky您解决了virtual
的重复关键问题了吗?你能发布一些你正在测试的实际数据吗?您的网络
地图在问题中仍然是错误的,因为您缺少commas@Ricky哎哟…在收集中留下了一些调试
…现在删除;-)@瑞奇:不,你不能,但你可以有一个指向列表的键def network=[“VMWARE”:[“00:68:8B:,“00:68:8A”]
我的错,这是问题中的一个输入错误,在我的程序中,我正在生成网络图
它给了我00:68:8B:00:68:8A 00:18:8A:00:68:8B:00:68:8A:
@Ricky您解决了与virtua
重复的关键问题了吗?你能发布一些你正在测试的实际数据吗?您的网络
地图在问题中仍然是错误的,因为您缺少commas@Ricky哎哟…在收集中留下了一些调试
…现在删除;-)@瑞奇:不,你不能,但你可以有一个指向列表的键<代码>def网络=[“VMWARE”:[“00:68:8B:”,“00:68:8A”]