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
的接近误导了我的眼睛。哈哈,不是我的问题,我同意一些更好的占位符会让这个问题更容易回答;-)