【问题标题】:How to stop a loop in Groovy如何在 Groovy 中停止循环
【发布时间】:2011-12-06 21:38:11
【问题描述】:

从集合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] &lt;&lt; (matches as int) 是如何工作的,因为它会产生我在上面发布的行(source:[matches, matches] 是输出)。

请指教,感谢您的帮助!

【问题讨论】:

  • 所以直截了当地说:fileMatches 是一个地图列表,每个地图的形式为[someFilename: value]?并且您想检索fileMatches 中具有someFilename 最大值的10 个条目?
  • 好吧,我不确定(这里是新手)。使用这段代码:def fileMatches = [:].withDefault{[]} new File('C:\\documents\\ForensicAll.txt').eachLine { line -&gt; def (source, matches) = line.split (/\t/)[0, 2] fileMatches[source] &lt;&lt; (matches as int)我最终得到了一堆看起来像这样的东西,这可能不是我想要的C:\programs\xwing\lasers.h:[25, 25]
  • 对不起,但应该澄清你的问题以及你的代码示例。我们很困惑。向我们展示给定的输入和预期的输出。
  • 好的,对不起,我试着把它清理了:)
  • 我发了一篇新帖子来解决我的收藏集的定义stackoverflow.com/questions/8408556/…

标签: arrays list loops collections groovy


【解决方案1】:

使用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]

【讨论】:

  • 您可以将 compareTo 更改为:tup2.value tup1.value
  • 很好的补充!我不知道这个比较器:)
  • 我最终没有完全理解你的问题,但是很好解决了!
  • 如何更改它以获取最小的 10 个值?
  • 类似topTen = fileMatches.sort({tup1, tup2 -&gt; tup1.value &lt;=&gt; tup2.value}).take(10)
【解决方案2】:

您可能会发现使用 Groovy 提供的一些内置收集方法更容易,例如:

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

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

如果您有

【讨论】:

  • 您可以将排序简化为 fileMatches.sort { it.someFilename }。单个 arg 闭包将应用于两侧,并比较结果。
  • @ataylor - 虽然这不会对它们进行降序排序;它仍然可能与负范围一起使用以获取最后 10 个或其他内容。
猜你喜欢
  • 2022-01-11
  • 2012-05-20
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2010-09-26
相关资源
最近更新 更多