如何在不覆盖当前条目的情况下添加多个 Groovy 映射条目? [英] How do I add multiple Groovy map entries without overwriting the current entries?
问题描述
我对 Groovy Maps 的问题.我一直在寻找一种以编程方式将新条目添加到 Groovy 映射而不覆盖当前条目的方法.例如
My question with Groovy Maps. I've been searching for a way to programmatically add a new entry to a Groovy map without overwriting the current entry. For example
def editsMap = [:]
lineEdits.flag.each
{ lineEdits_Flag ->
editsMap.put('FlagId',lineEdits_Flag.id)
editsMap.put('FlagMnemonic',lineEdits_Flag.mnemonic)
editsMap.put('Action',lineEdits_Flag.action)
println "editsMap: ${editsMap}"
}
第一遍产生这张地图:
editsMap: [FlagId:10001, FlagMnemonic:TRA, Action:review]
The first pass produces this map:
editsMap: [FlagId:10001, FlagMnemonic:TRA, Action:review]
但是第二遍覆盖了第一遍:editsMap: [FlagId:10002, FlagMnemonic:REB, Action:deny]
But the second pass overwrites the first pass with: editsMap: [FlagId:10002, FlagMnemonic:REB, Action:deny]
我想做的是在一张地图中创建多个条目.我需要我的地图来填充这样的东西:
What I'm trying to do is create multiple entries within the one map. I need my map to populate something like this:
editsMap: [FlagId:10001, FlagMnemonic:TRA, Action:review]
editsMap: [FlagId:10002, FlagMnemonic:REB, Action:deny]
editsMap: [FlagId:10003, FlagMnemonic:UNB, Action:deny]
editsMap: [FlagId:20001, FlagMnemonic:REB, Action:deny]
editsMap: [FlagId:20002, FlagMnemonic:ICD, Action:review]
editsMap: [FlagId:30001, FlagMnemonic:REB, Action:deny]
editsMap: [FlagId:40001, FlagMnemonic:ICD, Action:review]
editsMap: [FlagId:40002, FlagMnemonic:MPR, Action:review]
editsMap: [FlagId:50001, FlagMnemonic:CPT, Action:deny]
editsMap: [FlagId:60001, FlagMnemonic:DTU, Action:deny]
editsMap: [FlagId:70001, FlagMnemonic:ICD, Action:review]
editsMap: [FlagId:70002, FlagMnemonic:MPR, Action:review]
填充地图后,我需要能够找到某些值才能处理消息.我相信我可以使用类似的东西:
Once I have populated my map then I need to be able to find certain values in order to process a message. I believe that I can use something like:
def thisValue = appliedEditsMap[FlagId, '10001'] ?: "default"
进行快速查找.
有人可以帮助我了解如何以编程方式向 Groovy 映射添加值而不覆盖映射中已有的值吗?
Can someone help me understand how to programmatically add values to a Groovy map without overwriting the values already in the map?
推荐答案
你想要Guava 的 MultiMap:
Multimap<String, String> myMultimap = ArrayListMultimap.create();
// Adding some key/value
myMultimap.put("Fruits", "Bannana");
myMultimap.put("Fruits", "Apple");
myMultimap.put("Fruits", "Pear");
myMultimap.put("Vegetables", "Carrot");
// Getting values
Collection<string> fruits = myMultimap.get("Fruits");
System.out.println(fruits); // [Bannana, Apple, Pear]
这家伙对 Multimap 进行了纯 Groovy 模拟:
This guy makes a pure Groovy emulation of Multimap:
class GroovyMultimap {
Map map = [:]
public boolean put(Object key, Object value) {
List list = map.get(key, [])
list.add(value)
map."$key" = list
}
}
您可以在地图操作中使用 putAt
和 getAt
作为语法糖.你也可以试试 mixin 在地图对象中.
You can use putAt
and getAt
for syntatic sugar in map operations. You can also try a mixin in a map object.
他还将 Groovy 与 Guava 的 multimap 结合使用:
He also uses Groovy with Guava's multimap:
List properties = ['value1', 'value2', 'value3']
Multimap multimap = list.inject(LinkedListMultimap.create()) {
Multimap map, object ->
properties.each {
map.put(it, object."$it")
}
map
}
properties.each {
assertEquals (multimap.get(it), list."$it")
}
这篇关于如何在不覆盖当前条目的情况下添加多个 Groovy 映射条目?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!