清除地图/馆藏(Groovy)的混乱

时间:2011-12-06 23:47:33

标签: arrays list collections groovy maps

我定义了一个集合,它应该在一个以制表符分隔的文本文件中映射一行的两个部分:

def fileMatches = [:].withDefault{[]}

new File('C:\\BRUCE\\ForensicAll.txt').eachLine { line ->
def (source, matches) = line.split (/\t/)[0, 2]
fileMatches[source] << (matches as int)}

我最终得到filename:[984, 984]这样的条目,我希望[filename : 984]。我不明白fileMatches[source] << (matches as int)是如何运作的。我怎么能得到我需要的那种系列?

1 个答案:

答案 0 :(得分:1)

我不太清楚我明白你要做什么。例如,如何处理两个值不同而不是相同的行(这似乎是您的代码隐含的内容)?地图需要唯一键,因此如果它有多个值,则不能使用filename作为键。

也就是说,您可以使用以下结果得到您想要的结果:

def fileMatches = [:]
new File('C:\\BRUCE\ForensicAll.txt').eachLine { line ->
    def (source, matches) = line.split(/\t/)[0,2]
    fileMatches[source] = (matches as int)
}

但这会破坏数据(即,您将始终以文件最后一行的第二个值结束。如果这不是您想要的,您可能需要在此重新考虑您的数据结构。

或者,假设您需要唯一值,您可以这样做:

def fileMatches = [:].withDefault([] as Set)
new File('C:\\BRUCE\ForensicAll.txt').eachLine { line ->
    def (source, matches) = line.split(/\t/)[0,2]
    fileMatches[source] << (matches[1] as int)
}

对于示例数据,这将产生[filename:[984]],对于您正在检查的两列中具有这两个值的文件,例如[filename:[984, 987]]

同样,它实际上取决于你想要捕获的内容。如果您可以提供有关您要完成的内容的更多详细信息,那么您的问题可能会变得有问题......