我有一个很棒的列表列表,比如
list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]
我想按第一个元素的顺序排序,然后是第二个,然后是第三个。
期望的
assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]
我从list = list.sort{ a,b -> a[0] <=> b[0] }
开始,但这只对第一个元素排序。你是怎么结束的?
谢谢
发布于 2009-09-23 19:48:44
您应该能够以逆序遍历所需的排序:
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]]
每种方法都应该覆盖前面的方法,以保持组合排序的完整性。
您还可以使用Elvis operator, ?:
按顺序链接它们,当前一个相同时( <=>
返回0
),它将推迟到下一次比较:
list.sort { a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2] }
发布于 2009-09-23 22:08:48
如果你想对任意长度(尽管是同质的)数组进行排序,你可以使用下面的命令,它可以在一次传递中完成:
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]]
发布于 2015-05-25 23:55:55
下面是使用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]]
来源:Groovier way of sorting over multiple fields in a list of maps in groovy
https://stackoverflow.com/questions/1467641
复制相似问题