当sort
运算符(compareTo)列表失败时,spaceship
如何处理列表列表?
请注意,它不只是equals
,而是compareTo
(更大,更低或相等)
def v1=[1, 2, 0]
def v2=[1, 3, 0]
def v=[v2,v1]
println v
//prints> [[1, 3, 0], [1, 2, 0]]
v=v.sort()
assert v[0]==v1
println v
//prints> [[1, 2, 0], [1, 3, 0]]
c=c.sort{x,y-> y<=>x}
//throws Cannot compare java.util.ArrayList with value '[1, 3]' and java.util.ArrayList with value '[1, 2, 3]'
根据上面的代码List<List>.sort()
有效。
根据Iterable.sort() documentation:
对集合进行排序。假设收集项目具有可比性,并使用其自然顺序来确定生成的订单。
List<List>.sort()
为什么以及如何在groovy中运作的问题?
有人能指出我如何比较在sort()
操作的groovy中实现的数组吗?
答案 0 :(得分:1)
不同行为的原因是因为涉及不同的方法。当您调用c.sort{x,y-> y<=>x}
时,会调用Iterable.sort
,这会引发异常,因为列表中的元素不是Comparable
。
但是,当您致电v.sort()
时,您正在调用DefaultGroovyMethods.java
中定义的此方法
public static <T> List<T> sort(Iterable<T> self) {
return sort(self, true);
}
调用此:
public static <T> List<T> sort(Iterable<T> self, boolean mutate) {
List<T> answer = mutate ? asList(self) : toList(self);
Collections.sort(answer, new NumberAwareComparator<T>());
return answer;
}
正如您所看到的,这提供了一个Comparator
来确定列表元素的顺序,因此它们不需要自己Comparable
。