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”]