2

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

4

2 回答 2

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

    请注意,当您想通过某个值或某个“权重”来比较元素时,使用这种一元闭包变体非常方便,每个元素的计算方式都相同。

于 2012-06-11T14:13:31.570 回答
3

sort您的代码片段中使用比较器参数方法调用 - 请参阅http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html#sort(java.util.Comparator )

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

于 2012-06-11T13:43:41.153 回答