2017-06-27 55 views
1

如果spaceship運算符(compareTo)對列表失敗,sort如何在列表的列表上工作?Groovy列表清單:當飛船操作失敗時,排序如何工作?

注意,它不只是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中工作?

有人可以指點我如何比較Groovy中執行sort()操作的數組嗎?

+0

它是'v.sort {x,y-> y <=> x}'? – Rao

+0

這怎麼樣 - https://stackoverflow.com/questions/2544258/how-can-i-compare-two-lists-in-groovy – Rao

+0

那麼,不要使用'<=>'運營商?運營商無法猜測您想如何比較列表。你如何定義哪個列表更大?您必須定義應使用什麼標準或標準來定義訂單,然後您必須將其制定爲代碼。如果您不確定如何執行此操作,請添加您的排序要求,何時有一個列表變小,何時有一個列表變大以及何時有兩個列表與排序相同。 – Vampire

回答

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