对列表列表进行排序时的绝妙“宇宙飞船运算符”

问题描述 投票:0回答:1

如果我有一个列表列表,那么

.sort()
就可以自然地工作;即,按元素:

groovy:000> [[3,2,1],[3,1,2],[2,1,3],[2,3,1],[1,2,3],[1,3,2],[1,3,3],[1,2,2]].sort()                      
===> [[1, 2, 2], [1, 2, 3], [1, 3, 2], [1, 3, 3], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

但是,如果我使用

<=>
运算符编写显式排序闭包,则会失败:

groovy:000> [[3,2,1],[3,1,2],[2,1,3],[2,3,1],[1,2,3],[1,3,2],[1,3,3],[1,2,2]].sort { a, b -> a <=> b }
ERROR java.lang.IllegalArgumentException:
Cannot compare java.util.ArrayList with value '[3, 1, 2]' and java.util.ArrayList with value '[3, 2, 1]'
        at groovysh_evaluate$_run_closure1.doCall (groovysh_evaluate:3)

在这个玩具案例中,这并不重要,但我有一个更复杂的结构,需要我使用排序闭包。我知道,根据

documentation
<=>
.compareTo
的语法糖,而
java.util.ArrayList
值没有。然而,“裸排序”如何解决这个问题呢?

我之所以问是因为我找到了解决方案,但感觉有点笨拙:

listOfLists.sort { a, b -> new Tuple(*a) <=> new Tuple(*b) }

我想知道是否有更惯用的解决方案可以有效地实现与裸排序相同的功能?

sorting groovy
1个回答
0
投票

<=>
Comparable.compareTo
的重载运算符;因此 LHS 必须实现此方法,而
List
没有,因此会出现错误。

当仅使用

[].sort()
时,groovy 使用
NumberAwareComparator
, 它试图使用
DefaultTypeTransformation.compareTo
, 再次期望 LHS 是 一个
Comparable
(或者是
Number
,但我们可以在这里忽略它)。由于 LHS 不是 a
Comparable
,该方法抛出并且
NumberAwareComparator
掉落 回到比较哈希值 代码 双方。

是否相信这种行为是另一回事。包裹着 在容器中进行比较,可以

compareTo
(如
Tuple
)感觉不错 更安全(例如正确短路)

© www.soinside.com 2019 - 2024. All rights reserved.