我定义了一个集合,它应该在一个以制表符分隔的文本文件中映射一行的两个部分:
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)
是如何运作的。我怎么能得到我需要的那种系列?
答案 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]]
。
同样,它实际上取决于你想要捕获的内容。如果您可以提供有关您要完成的内容的更多详细信息,那么您的问题可能会变得有问题......