使用奇怪的groovy代码进行排序

时间:2012-06-11 13:34:06

标签: sorting groovy

我是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种排序方法,我不确定这里使用的是哪种方法)

2 个答案:

答案 0 :(得分:8)

代码正在使用Collection#sort(Closure)。请注意,此方法有两种变体:

  1. 如果闭包是二进制的(即它需要两个参数),sort将它用作典型的比较器接口:当第一个参数较小时,它应该返回一个负整数,零或一个正整数比第二个参数分别比,等于或更大。

    这是在该段代码中使用的变体。它通过第一个元素比较列表中的元素,而这些元素又是列表。

  2. 如果闭包是一元的(即它只需要一个参数),它将用于生成随后将用于比较的值(在某些语言中,这称为“键”函数)。

    因此,您发布的代码片段可以重写为:

    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

因此,您使用自己的比较器对集合进行排序。现在比较器只使用内部集合的第一个元素来决定外部集合的顺序。