所以基本上我有这样的事情:
[a: ["c","d"], b: ["e","f"]]
每个列表中的项目数量是任意的。如果只有一项,则列表不再是列表,而是字符串。
我想把它变成:
[ [a:"c", b:"e"], [a:"d",b:"f"] ]
我真的不在乎解决方案是否使用 Groovy 方法。谢谢你的帮助!
最佳答案
这是另一种方法,我认为它不那么晦涩,同时仍然相当简洁:
def ml = [a: ["c","d"], b: ["e","f"]]
// Create an empty list that creates empty maps as needed
def lm = [].withDefault{ [:] }
ml.each{ k, values ->
[values].flatten().eachWithIndex { value, index ->
lm[index][k] = value
}
}
assert lm == [[a:"c", b:"e"], [a:"d", b:"f"]]
如果您不想或不能使用
withDefault
(因为您不希望列表自动增长),那么这也有效:def ml = [a: ["c","d"], b: ["e","f"]]
def lm = []
ml.each{ k, values ->
[values].flatten().eachWithIndex { value, index ->
lm[index] = lm[index] ?: [:]
lm[index][k] = value
}
}
assert lm == [[a:"c", b:"e"], [a:"d", b:"f"]]
编辑 :添加了处理不在列表中的字符串的代码。
请注意,给定的技巧(
[values].flatten().eachWithIndex{...}
)不一定非常有效。如果速度是必不可少的,那么使用它会以牺牲可读性为代价稍微快一点:(values instanceof List ? values : [values]).eachWithIndex{...}
关于list - 列表的 Groovy 映射到映射列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15578281/