You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:24:53