Groovy list.sort由第一,第二和第三个元素组成

26 sorting groovy

我有一个groovy列表列表,即

list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]
Run Code Online (Sandbox Code Playgroud)

我想按第一个元素的顺序排序,然后是第二个元素,然后是第三个元素.

预期

assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]
Run Code Online (Sandbox Code Playgroud)

我开始时list = list.sort{ a,b -> a[0] <=> b[0] }只是排序第一个元素.你怎么样?

谢谢

Jon*_*ski 28

您应该能够以相反的顺序迭代所需的排序:

list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]

list = list.sort{ a,b -> a[2] <=> b[2] }
list = list.sort{ a,b -> a[1] <=> b[1] }
list = list.sort{ a,b -> a[0] <=> b[0] }

assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]
Run Code Online (Sandbox Code Playgroud)

每个都应该覆盖前一个,足以保持组合排序的完整性.


您也可以使用Elvis运算符?:按顺序链接它们,当前相等(并<=>返回0)时,它将遵循下一个比较:

list.sort { a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2] }
Run Code Online (Sandbox Code Playgroud)

  • 它应该在理论上 - 潜在 - 为什么你不检查它?正确答案是最后一个,你可以取消括号:`list.sort {a,b - > a [0] <=> b [0]?:a [1] <=> b [1] ?:a [2] <=> b [2]}` (4认同)

Ted*_*eid 8

如果你想对任意(虽然是同质的)长度的数组进行排序,你可以使用它,它将在一次传递中完成:

def list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]

list.sort { a, b -> 
    for (int i : (0..<a.size())) {
        def comparison = (a[i] <=> b[i])
        if (comparison) return comparison
    } 
    return 0
}

assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]
Run Code Online (Sandbox Code Playgroud)


cwe*_*ton 6

这是使用Groovy的SpaceshipElvis运算符的另一种方法:

?def list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]

list.sort { a, b ->
   a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2]
}

assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]?
Run Code Online (Sandbox Code Playgroud)

来源:Groovier在groovy中的地图列表中对多个字段进行排序的方式