我是groovy的初学者,我似乎无法理解这段代码。你能告诉我这段代码是如何运作的吗?
def list = [ [1,0], [0,1,2] ]
list = list.sort { a,b -> a[0] <=> b[0] }
assert list == [ [0,1,2], [1,0] ]
我所知道的是第二行应该返回值1,因为宇宙飞船运营商但是它的用途是什么?这是什么类型的? (gdk api中有6种排序方法,我不确定这里使用的是哪种方法)
答案 0 :(得分:8)
代码正在使用Collection#sort(Closure)
。请注意,此方法有两种变体:
如果闭包是二进制的(即它需要两个参数),sort
将它用作典型的比较器接口:当第一个参数较小时,它应该返回一个负整数,零或一个正整数比第二个参数分别比,等于或更大。
这是在该段代码中使用的变体。它通过第一个元素比较列表中的元素,而这些元素又是列表。
如果闭包是一元的(即它只需要一个参数),它将用于生成随后将用于比较的值(在某些语言中,这称为“键”函数)。
因此,您发布的代码片段可以重写为:
def list = [[1,0], [0,1,2]]
list = list.sort { it[0] } // or { it.first() }
assert list == [[0,1,2], [1,0]]
请注意,当您想要通过某个值或某些“权重”比较元素时,使用这种一元闭包变量非常方便,而这些“权重”对每个元素的计算方式都相同。
答案 1 :(得分:3)
代码段中的sort
使用比较器参数方法调用 - 请参阅http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html#sort(java.util.Comparator)
因此,您使用自己的比较器对集合进行排序。现在比较器只使用内部集合的第一个元素来决定外部集合的顺序。