Groovy列表列表排序:默认sort可用,飞船运算符却失效?求优雅解法
Groovy列表的列表排序:默认逻辑生效原因及显式闭包的简洁实现
为什么无参sort()能正常工作?
Groovy的无参sort()并没有依赖ArrayList自身的compareTo方法(毕竟ArrayList并未实现Comparable接口),而是通过Groovy内置的DefaultTypeTransformation.compare方法完成比较——这个方法会递归地对集合元素进行逐位比较,这就是列表的列表能自然按元素排序的核心原因。
而直接用a <=> b报错,是因为<=>是Comparable.compareTo的语法糖,ArrayList没实现这个接口,自然无法直接比较。
更符合Groovy风格的显式排序实现
如果需要在自定义闭包中复用默认的列表比较逻辑,有几种简洁的写法:
1. 直接调用Groovy内置比较工具
无需手动转成Tuple,直接复用Groovy的默认比较逻辑:
import org.codehaus.groovy.runtime.DefaultTypeTransformation def listOfLists = [[3,2,1],[3,1,2],[2,1,3],[2,3,1],[1,2,3],[1,3,2],[1,3,3],[1,2,2]] listOfLists.sort { a, b -> DefaultTypeTransformation.compare(a, b) }
2. 使用GroovyCollections工具类(更简洁)
groovy.util.GroovyCollections的compare方法封装了上述逻辑,写法更简洁:
import groovy.util.GroovyCollections def listOfLists = [[3,2,1],[3,1,2],[2,1,3],[2,3,1],[1,2,3],[1,3,2],[1,3,3],[1,2,2]] listOfLists.sort { a, b -> GroovyCollections.compare(a, b) }
3. 复杂结构下的组合排序
如果是更复杂的结构(比如嵌套对象+列表),可以先按自定义规则排序,再复用默认列表比较逻辑,比如:
import org.codehaus.groovy.runtime.DefaultTypeTransformation def complexItems = [ [group: 'B', values: [3,2,1]], [group: 'A', values: [1,3,2]], [group: 'A', values: [1,2,3]] ] // 先按group排序,再按values的默认列表规则排序 complexItems.sort { a, b -> def groupComp = a.group <=> b.group groupComp != 0 ? groupComp : DefaultTypeTransformation.compare(a.values, b.values) }
内容的提问来源于stack exchange,提问作者Xophmeister
相关产品推荐
相关产品推荐

