我有一个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)
如果你想对任意(虽然是同质的)长度的数组进行排序,你可以使用它,它将在一次传递中完成:
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)
这是使用Groovy的Spaceship和Elvis运算符的另一种方法:
?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中的地图列表中对多个字段进行排序的方式