首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Groovy list.sort按第一、第二和第三个元素排序

Groovy list.sort按第一、第二和第三个元素排序
EN

Stack Overflow用户
提问于 2009-09-23 18:00:16
回答 8查看 28.3K关注 0票数 27

我有一个很棒的列表列表,比如

代码语言:javascript
运行
复制
list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]

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

期望的

代码语言:javascript
运行
复制
assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]

我从list = list.sort{ a,b -> a[0] <=> b[0] }开始,但这只对第一个元素排序。你是怎么结束的?

谢谢

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-09-23 19:48:44

您应该能够以逆序遍历所需的排序:

代码语言:javascript
运行
复制
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),它将推迟到下一次比较:

代码语言:javascript
运行
复制
list.sort { a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2] }
票数 33
EN

Stack Overflow用户

发布于 2009-09-23 22:08:48

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

代码语言:javascript
运行
复制
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]]
票数 8
EN

Stack Overflow用户

发布于 2015-05-25 23:55:55

下面是使用Groovy的SpaceshipElvis操作符的另一种方法:

代码语言:javascript
运行
复制
​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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1467641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档