list - 列表的 Groovy 映射到映射列表

标签 list map groovy

所以基本上我有这样的事情:

[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/

相关文章:

string - 什么函数用于格式化/替换 Grails/Groovy 中字符串中的 {0} {1} 参数?

python - 通过多个维度索引列表的方法

list - 在flutter中没有从json中获取用户名的所有记录

c# - 遍历列表并从中删除项目的最佳方法?

java - 列表与 map : Which takes less space and more efficient?

c++ - std::map 索引和插入调用之间的区别

grails - 如何通过遍历数组或映射来保存多行数据?

python - 将列表插入同一列表时的省略号

java - 寻找并发 map 支持事件

java - 在代理后面使用 Jodd HTTP 库