groovy列表清单:当太空飞船运营商失败时排序如何运作?

时间:2017-06-27 10:11:55

标签: groovy

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中实现的数组吗?

1 个答案:

答案 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