Wow... Kiyotaka Oku's fork of this shows how to do it in one line :-)
The other day, I saw Harold Cooper's One-line tree in Python via autovivication, and wondered if the same thing was possible in Groovy.
The answer is yes! But you need to define the variable tree
before you can assign it to the self-referential withDefault
closure, hence with Groovy, it's a two-line solution ;-)
Anyway, given:
def tree
tree = { -> return [:].withDefault{ tree() } }
We can then do:
users = tree()
users.harold.username = 'hrldcpr'
users.yates.username = 'tim'
And printing this out
println new groovy.json.JsonBuilder( users ).toPrettyString()
gives:
{
"harold": {
"username": "hrldcpr"
},
"yates": {
"username": "tim"
}
}
excellent +1