2016-07-25 14 views
1

私は現在Javaでコレクションをソートしようとしています。 「比較メソッドがその一般契約に違反しています」というエラーメッセージが表示されます。私もこのエラーメッセージを理解していますが、私は(大部分は)buildinのcompareToメソッドをLong型のメソッドを使用しています。だから私は知らない。その場合、ソートのメソッドは依然として契約に違反している。ここに私のコードは次のとおりです。buildin compareTo:比較メソッドがその一般契約に違反しています

@Override 
public int compareTo(DataAge another) { 
    if(this == null || another == null) 
     return 0; 

    Long a = new Long(this.getAge()); 
    Long b = new Long(another.getAge()); 
    return a.compareTo(b); 
} 

そして、ここでエラー:null sは許可されていると仮定すると

Java exception occurred: 
java.lang.IllegalArgumentException: Comparison method violates its general contract! 

at java.util.ComparableTimSort.mergeLo(Unknown Source) 

at java.util.ComparableTimSort.mergeAt(Unknown Source) 

at java.util.ComparableTimSort.mergeCollapse(Unknown Source) 

at java.util.ComparableTimSort.sort(Unknown Source) 

at java.util.ComparableTimSort.sort(Unknown Source) 

at java.util.Arrays.sort(Unknown Source) 

at java.util.Collections.sort(Unknown Source) 

at dd.GMAAnalyzer.sortData(Analyzer.java:158) 
+0

注:: 'この==のnull'なので、常に偽である

Note that null is not an instance of any class, and e.compareTo(null) should throw a NullPointerException even though e.equals(null) returns false.

また、あなたはLongインスタンスを作成する必要はありません。 –

答えて

5

nullは何と等しいので、あなたのメソッドのロジックは、間違っています。これは間違っています。なぜなら、それ自体では等しくない複数のものと同等のものを比較し、過渡性を破るからです。

null sが先に並べ替えたり、他の数字の後ろに、独立しnull比較(あなたはそれのための比較を必要としないのでthisは、nullに等しいことはできません)を追加する必要があるかどうかを判断、この問題を修正します。 ComparableのJavadocのから

if(another == null) 
    return 1; // If you want nulls in the back, return -1 
+0

ありがとう、問題を解決しました – Thorsten

1

return Long.compare(this.getAge(), another.getAge()); 
関連する問題