2015-10-14 78 views
-1

對不起,此問題已在其他帖子上得到解答。不幸的是我不知道如何實現它在我的代碼:JAVA排序方法異常:比較方法違反其總體合同

public int compare(Group gp1, Group gp2){ 
    if (gp1.isPredOf(gp2)) 
     return 1; 
    if (gp2.isPredOf(gp1)) 
     return -1; 
    return 0; 
}  

注意,如果gp1gp2前身,gp2.isPredOf(gp1)將返回false,反之亦然。

您能否告訴我適當的代碼以避免此異常?

線程「AWT-EventQueue-0」中的異常java.lang.IllegalArgumentException:比較方法違反了它的一般合約!

謝謝你的幫忙。

PS:函數 「isPredOf」 的代碼:

public boolean isPredOf(Group gp2){ 
    for (Operation op1 : this.operations){ 
     for (int i=0;i<=op1.job.operations.indexOf(op1);i++){ 
      if (gp2.operations.contains(op1.job.operations.get(i))) 
       return true; 
      } 
    } 

    return false; 
}        
+2

後isPredOf'方法'代碼(或它的簡化版本) – Tunaki

+0

如果你已經實現了這也將是需要了解的'hashCode'和'Group'類中的'equals'? – hugh

+0

這是函數「isPredOf」'代碼'的代碼public boolean isPredOf(Group gp2){(op1:this.operations){for {int i = 0; i <= op1.job.operations .indexOf(op1); i ++){(gp2.operations.contains(op1.job.operations.get(i))) return true; } } return false; '代碼' – user1183836

回答

0

isPredOf可能是不尊重傳遞。檢查他們可能會產生這種問題的空參數。

的官方文檔(http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html)說:

The implementor must ensure that sgn(compare(x, y)) == -sgn(compare(y, x)) for all x and y. (This implies that compare(x, y) must throw an exception if and only if compare(y, x) throws an exception.) 

The implementor must also ensure that the relation is transitive: ((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0. 

Finally, the implementor must ensure that compare(x, y)==0 implies that sgn(compare(x, z))==sgn(compare(y, z)) for all z. 
相關問題