Как остановить цикл в Groovy - PullRequest
0 голосов
/ 07 декабря 2011

Из коллекции fileMatches я хочу присвоить карты с 10 самыми большими значениями новой коллекции под названием topTen. Поэтому я стараюсь сделать коллекцию:

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

Я хочу перебрать мою коллекцию и взять 10 карт с самыми большими значениями. Одна из проблем, с которой я могу столкнуться, заключается в том, что результат этого не выглядит так, как я себе представлял. Например, одна запись:

C:\cygwin\home\pro-services\git\projectdb\project\stats\top.h:[984, 984]

Советы до сих пор были превосходными, но я не уверен, что моя коллекция организована так, чтобы использовать предложенные решения (у меня есть filename:[984, 984], когда, возможно, я хочу [filename, 984] в качестве записей карты в моей коллекции) , Я пока не совсем разбираюсь в этом (например, как работает fileMatches[source] << (matches as int), поскольку он создает строку, которую я разместил сразу выше (с выводом source:[matches, matches]).

Пожалуйста, сообщите, и спасибо за помощь!

Ответы [ 2 ]

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

Проверьте этот другой подход, используя навыки Collection. Он делает то, что вы хотите с некоторой простотой ...

def fileMatches = [um: 123, dois: 234, tres: 293, quatro: 920, cinco: 290];
def topThree;

topThree = fileMatches.sort({tup1, tup2 -> tup2.value <=> tup1.value}).take(3);

Результат:

Result: [quatro:920, tres:293, cinco:290]
2 голосов
/ 07 декабря 2011

Возможно, вам будет проще использовать некоторые из встроенных методов сбора, предоставляемых Groovy, например ::100100

fileMatches.sort { a, b -> b.someFilename <=> a.someFilename }[0..9]

или

fileMatches.sort { it.someFileName }[-1..-10]

Диапазон в конце там приведет к ошибке, если у вас <10 ​​записей, поэтому может потребоваться некоторая корректировка, если это ваш случай.

...