簡體   English   中英

將地圖的值與Groovy中的另一個地圖值進行比較

[英]Compare a map's value with another map value in groovy

我有一個要求,如果我想獲取第一張地圖的key ,我想和另一map's value a map's value一起檢查a map's value

虛擬化地圖

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:"
]

因此,在從networkvirtua匹配值之后,我得到以下輸出,如何在Groovy中做到這一點?

eth0,00:68:8B:,VMWARE
eth1,00:18:8A:,COLINUX
eth2,00:68:8A:,VMWARE

更新 @tim_yates@Xaerxess回答后,我認為最好將MAC地址作為密鑰,因為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 }

編輯-鍵:列表示例

在評論中,有人問我一個映射,該映射具有作為列表的值(以解決重復鍵問題);

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}"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM