2017-06-27 4 views
1

spaceship演算子(compareTo)がリストに失敗した場合、リストのリストにはどのように作用するのですか?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()作品?

誰かが配列の比較はsort()操作のためにGroovyで実装する方法私を指すことができますか?

+0

''それv.sort {X、Y> Y <=> X}はありますか? – Rao

+0

どのようにこのことについて - https://stackoverflow.com/questions/2544258/how-can-i-compare-two-lists-in-groovy – Rao

+0

まあ、 '' <=>演算子を使用していませんか?オペレータは、リストを比較する方法を推測することはできません。どんなリストが大きいかをどのように定義しますか?順序を定義するためにどの基準を使用すべきかを定義し、それをコードとして定式化する必要があります。あなたがそれを行う方法がわからない場合は、ソート要件を追加します.1つのリストが小さい場合、1つのリストが大きい場合、ソートに関して2つのリストが同じ場合はいつ追加しますか。 – 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); 
} 

で定義され、この方法で起動している:あなたは、この順序を決定するためにComparatorを提供して見ることができるように

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; 
} 

をリスト要素のうち、Comparableである必要はありません。

関連する問題