【发布时间】:2011-11-10 23:29:06
【问题描述】:
【问题讨论】:
标签: file list collections groovy indexing
【问题讨论】:
标签: file list collections groovy indexing
如果您有清单,即:
def list = [ 'c', 'a', 'b' ]
知道原始索引的一种方法是使用transpose()将此列表加入计数器,然后对新列表进行排序,然后您将获得一个以原始索引作为辅助元素的排序列表
即:
[list,0..<list.size()].transpose().sort { it[0] }.each { item, index ->
println "$item (was at position $index)"
}
将其分解;
[list,0..<list.size()]
给我们(有效地)一个新列表[ [ 'c', 'a', 'b' ], [ 0, 1, 2 ] ]
为此致电transpose() 给我们:[ [ 'c', 0 ], [ 'a', 1 ], [ 'b', 2 ] ]
然后我们使用sort { it[0] }根据每个元素中的第一项(原始列表中的字母)对列表进行排序
然后遍历每一个,打印出我们现在排序的项目,以及它的原始索引位置
【讨论】:
collect 也可以发挥作用:def i = 0; list.collect { [it, i++] },也许它更容易理解。 inject 也可以做到这一点,不需要额外的声明,但我认为它不那么漂亮。很遗憾collect 不接受带有元素和索引的闭包 (yet),或者没有类似 Python 的 enumerate。
List 中添加一个enumerate 方法,以获取(索引,值)对的列表,例如Python's equivalent。干杯。
如果值是唯一的,您可以只使用indexof 方法而不是原始列表。例如,如果您有列表:
def list = [4, 8, 0, 2, 9, 5, 7, 3, 6, 1]
而且你知道如何获得 5 个最大值:
def maxVals = list.sort(false, {-it}).take 5 // This list will be [9, 8, 7, 6, 5]
你可以这样做:
def indexes = maxVals.collect { list.indexOf it }
println indexes
它会打印出来:
[4, 1, 6, 8, 5]
【讨论】:
def maxVals...
sort(boolean mutate, Closure closure)。将false作为第一个参数传递,防止排序方法修改原始列表;它改为返回一个新的排序列表。第二个参数是一个闭包,它返回用于在 sort 方法中进行比较的值。在这种情况下,传递闭包{-it} 将按降序对列表进行排序。整行相当于def maxVals = list.clone().sort().reverse().take(5)
def maxVals = list.sort(false).reverse().take(5)。