Устранение путаницы с Картами / Коллекциями (Groovy) - PullRequest
0 голосов
/ 07 декабря 2011

Я определяю коллекцию, которая должна отображать две части строки в текстовом файле, разделенном табуляцией:

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 Ответ

1 голос
/ 07 декабря 2011

Я не совсем уверен, что понимаю, что вы пытаетесь сделать. Как, например, вы обрабатываете строку, в которой два значения отличаются, а не одинаковы (что, по-видимому, и подразумевается вашим кодом)? Карта требует уникальных ключей, поэтому вы не можете использовать 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]] для файлов, имеющих эти два значения в двух столбцах, которые вы проверяете.

Опять же, это действительно зависит от того, что вы пытаетесь захватить. Если бы вы могли предоставить более подробную информацию о том, что вы пытаетесь достичь, ваш вопрос может стать ответом ...

...