user955732
user955732

Reputation: 1370

How to Create a map dynamically?

I'm a bit stuck here, creating a map like this i straight forward

def map = [[group="group1",member="groover"],
           [group="group1",member="jason"],
           [group="group2",member="groover"],
           [group="group2",member="jason"]
]

iterating over it and printing..

map.each{
    println it
}

.. (DESIRED) OUTPUT:

[group1, groover]
[group1, jason]
[group2, groover]
[group2, jason]

Now, how to create a similar map dynamically?

def dynamicMap = [:]

    for(int i=1;i<3;i++){  // This is not working particulary well...
        dynamicMap.group= "group$i"
        dynamicMap.member= "groover"
        dynamicMap.member= "jason"
    }

dynamicMap.each{
    println it
}

(INCORRECT) OUTPUT

group=group2
member=jason

Upvotes: 0

Views: 2095

Answers (3)

Paul
Paul

Reputation: 3058

Caveat, combinations() only works in 2.2.0+, I believe. Pre 2.2.0 example at the end. (I was also unclear if you want a list of maps or a list of lists.)

def groups = [ "group1", "group2"]
def members = [ "groover", "jason" ]
def list = [groups, members].combinations { g, m -> ["group": g, "member": m] }
list.each { println it }

// Gives:
//[group:group1, member:groover]
//[group:group2, member:groover]
//[group:group1, member:jason]
//[group:group2, member:jason]

// OR
list = [groups, members].combinations { g, m -> [g, m] }
list.each { println it }

// Gives:
//[group1, groover]
//[group2, groover]
//[group1, jason]
//[group2, jason]

// But if you don't actually need the resulting list of lists
// (i.e. you just want to process the combinations)
[groups, members].eachCombination { println it }

// Gives:
//[group1, groover]
//[group2, groover]
//[group1, jason]
//[group2, jason]

// OR (Should work pre-2.2.0+)
list = []
groups.each { g ->
   members.each { m -> list << [g, m] /* or ["group": g, "member": m] */ }
}
list.each { println it }

// Gives:
//[group1, groover]
//[group2, groover]
//[group1, jason]
//[group2, jason]

Upvotes: 0

tim_yates
tim_yates

Reputation: 171054

That's a list of maps, not a map, but:

def dynamicMap = (1..2).collectMany { n ->
    [ [ group:"group$n", member:'groover' ],
      [ group:"group$n", member:'jason' ] ]
}

Upvotes: 3

musketyr
musketyr

Reputation: 828

First of all, your map isn't really map. It's a list of maps.

The solutions you're looking for is

def dynamicMap = []
for(int i=1;i<3;i++){ 
    dynamicMap << [group: "group$i", member: "groover"]
    dynamicMap << [group: "group$i", member: "jason"]
}

Upvotes: 2

Related Questions