Collections Groovy:将字符串转换为多重映射

Collections Groovy:将字符串转换为多重映射,collections,groovy,metaclass,multimap,Collections,Groovy,Metaclass,Multimap,我有一个字符串,看起来有点像这样: text = "foo/bar;baz/qux" ["level1" : ["foo", "baz"], "level2" : ["bar", "qux"]] 我的最终目标是将此字符串拆分为如下所示的多重映射: text = "foo/bar;baz/qux" ["level1" : ["foo", "baz"], "level2" : ["bar", "qux"]] 我还向LinkedHashMap的元类添加了多映射支持: LinkedHashMap

我有一个字符串,看起来有点像这样:

text = "foo/bar;baz/qux"
["level1" : ["foo", "baz"], "level2" : ["bar", "qux"]]
我的最终目标是将此字符串拆分为如下所示的多重映射:

text = "foo/bar;baz/qux"
["level1" : ["foo", "baz"], "level2" : ["bar", "qux"]]
我还向LinkedHashMap的元类添加了多映射支持:

LinkedHashMap.metaClass.multiPut << { key, value ->
    delegate[key] = delegate[key] ?: []; delegate[key] += value
}

您可以在返回的地图上使用
with default
,以消除三元:

def text = "foo/bar;baz/qux;foo/bar/woo"

def result = text.split(';')*.split('/').inject([:].withDefault {[]}) { map, value ->
    value.eachWithIndex { element, idx ->
        map["level${idx+1}"] << element
    }
    map
}

assert result == [level1:['foo', 'baz', 'foo'], level2:['bar', 'qux', 'bar'], level3:['woo']]
def text=“foo/bar;baz/qux;foo/bar/woo”
def result=text.split(“;”)*.split(“/”).inject([:].withDefault{[]}){map,value->
value.eachWithIndex{element,idx->

map[“level${idx+1}”]您可以在返回的map上使用
withDefault
,以消除三元:

def text = "foo/bar;baz/qux;foo/bar/woo"

def result = text.split(';')*.split('/').inject([:].withDefault {[]}) { map, value ->
    value.eachWithIndex { element, idx ->
        map["level${idx+1}"] << element
    }
    map
}

assert result == [level1:['foo', 'baz', 'foo'], level2:['bar', 'qux', 'bar'], level3:['woo']]
def text=“foo/bar;baz/qux;foo/bar/woo”
def result=text.split(“;”)*.split(“/”).inject([:].withDefault{[]}){map,value->
value.eachWithIndex{element,idx->

MAP[ [等级${IDX+1 }] ]

我接受它,我不认为它很聪明,但我发现读起来更容易:

def myMap = [:]

text.split(';').eachWithIndex{ entry, index ->
  myMap << ["level${index + 1}": entry.split('/')]
}

我不认为它很聪明,但我觉得读起来容易多了:

def myMap = [:]

text.split(';').eachWithIndex{ entry, index ->
  myMap << ["level${index + 1}": entry.split('/')]
}

简单完美。它完全符合我的需要。非常感谢!:)简单完美。它完全符合我的需要。非常感谢!:)这不会提供所需的输出,对吗?我的意思是
text.split(“;”)。withIndex()
不起作用(因为
split
返回数组,而不是列表)。无需将
final
分散到变量定义中。您的第一个解决方案将为您提供输出映射为
[level1:['foo',bar',level2:['baz',qux']
,而不是
[level1:['foo',baz',level2:['bar',qux]]
根据问题中的要求…因此,在回答您的问题时,此答案中的所有代码都有问题
['foo','bar']!=['foo','baz']
@tim_-yates我误读了你的说明,我认为
是分层的。
baz
的接近误导了我的眼睛。哈哈,不是我的问题,我同意一些更好的占位符会让这个问题更容易回答;-)这不会给出所需的输出,是吗?我的意思是
text.spl它(“;”)。withIndex()
将不起作用(因为
分割
返回一个数组,而不是一个列表)。无需将
最终
分散到变量定义中。您的第一个解决方案将为您提供输出映射为
[level1:['foo',bar',level2:['baz',qux']
,而不是
[level1:['foo',baz',level2:[“bar”,“qux”]
如问题中所要求……因此,在回答您的问题时,此答案中的所有代码都有问题
['foo','bar']!=['foo','baz']
@tim_-yates我误读了你的说明,我认为
是分层的。
条码和
baz
的接近误导了我的眼睛。哈哈,不是我的问题,我同意一些更好的占位符会让这个问题更容易回答;-)