如何在不覆盖当前条目的情况下添加多个Groovy映射条目? [英] How do I add multiple Groovy map entries without overwriting the current entries?

查看:142
本文介绍了如何在不覆盖当前条目的情况下添加多个Groovy映射条目?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题与Groovy地图我一直在寻找一种以编程方式向Groovy地图添加新条目而不覆盖当前条目的方法。例如

  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)
printlneditsMap:$ {editsMap}
}

第一遍产生此地图:

editsMap:[FlagId:10001,FlagMnemonic:TRA,Action:review]



但是第二遍会覆盖第一遍:
editsMap:[FlagId:10002,FlagMnemonic:REB,Action:deny]



我想要做的是在一张地图中创建多个条目。我需要我的地图来填充这样的东西:

  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: FlagMememonic:MPR,Action:review]

一旦我填充了我的地图,那么我需要能够找到某些值以处理消息。我相信我可以使用以下内容:

  def thisValue = appliedEditsMap [FlagId,'10001']?:default

进行快速查找。



可以有人帮助我了解如何以编程方式向Groovy地图添加值,而不覆盖地图中的值?

解决方案

Guava's MultiMap

  Multimap< String,String> myMultimap = ArrayListMultimap.create(); 

//添加一些键/值
myMultimap.put(Fruits,Bannana);
myMultimap.put(水果,苹果);
myMultimap.put(水果,梨);
myMultimap.put(蔬菜,胡萝卜);

//获取值
集合< string> fruits = myMultimap.get(Fruits);
System.out.println(fruits); // [Bannana,Apple,Pear]

这个人做了一个纯粹的Groovy仿真的Multimap:

  class GroovyMultimap {
Map map = [:]

public boolean put key,Object value){
列表列表= map.get(key,[])
list.add(value)
map$ key= list
}
}

您可以使用 putAt getAt 用于地图操作中的合成糖。您还可以尝试 mixin 在地图对象中。



他还使用Groovy与Guava的multimap:

 列表属性= ['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)
}


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

The first pass produces this map:
editsMap: [FlagId:10001, FlagMnemonic:TRA, Action:review]

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"

to do a quick lookup.

Can someone help me understand how to programmatically add values to a Groovy map without overwriting the values already in the map?

解决方案

You want something like Guava's 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]

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

You can use putAt and getAt for syntatic sugar in map operations. You can also try a mixin in a map object.

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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆