2017-11-18 113 views
0

我試圖對貸款狀態進行排序,其中貸款狀態爲活動,拒絕,待定和批准。主動貸款應該獲得最高優先級,其他任何順序。我實現了Comparator接口的compare()。引起:java.lang.IllegalArgumentException:比較方法違反其總體合同

這裏的進行比較()

@Override 
public int compare(Object o1, Object o2) { 
    LoanAccountData loanAccountData1 = (LoanAccountData) o1; 
    LoanAccountData loanAccountData2 = (LoanAccountData) o2; 

    if (loanAccountData1.getStatusStringValue().equals("Active")) { 
     return -1; 
    } else { 
     return 1; 
    } 
} 
+3

您正在比較兩個對象,完全忽略其中的一個。所以這沒有意義。例如,如果兩個對象都處於活動狀態,則比較a和b會生成。 –

回答

2

compare合同:here

您的代碼違反此規則:

實現程序必須確保SGN(比較(X,Y))== -sgn(對比(Y ,x))對於所有x和y。 (這意味着比較(X,Y)當且僅當比較(Y,X)拋出一個異常必須拋出異常。)

如果x處於有效狀態,且y的地位也活躍,那麼compare(x, y)會說x更小,而compare(y, x)會說y更小。

我想你在這裏要做的是將所有活動帳戶排序到列表的開始。這意味着如果兩個賬戶都是主動的或者兩者都是別的,他們是平等的。如果一個帳戶處於活動狀態,則認爲該帳戶較小。

LoanAccountData loanAccountData1 = (LoanAccountData) o1; 
LoanAccountData loanAccountData2 = (LoanAccountData) o2; 
boolean o1Active = loanAccountData1.getStatusStringValue().equals("Active"); 
boolean o2Active = loanAccountData2.getStatusStringValue().equals("Active"); 
if (o1Active == o2Active) { 
    return 0; 
} else if (o1Active) { 
    return -1; 
} else { 
    return 1; 
} 
+1

比我的短一點。罰款:) +1 – davidxxx

+0

甚至可以使用https://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html#compare(boolean,%20boolean) –

+0

@JBNizet我認爲在那麼你開始失去可讀性...... – Sweeper

2

這裏實現:

if (loanAccountData1.getStatusStringValue().equals("Active")) { 
    return -1; 

你永遠不會有第二個對象進行比較。
如果loanAccountData1.getStatusStringValue().equals("Active")loanAccountData2.getStatusStringValue().equals("Active")爲真,則違反對稱原則,因爲您應該返回0

與通用Comparator你可以寫:

public class LoanAccountDataComparatorByStatusActive implements Comparator<LoanAccountData> { 

    @Override 
    public int compare(LoanAccountData o1, LoanAccountData o2) {  

     boolean isData1StatusActive = o1.getStatusStringValue().equals("Active"); 
     boolean isData2StatusActive = o2.getStatusStringValue().equals("Active"); 

     // if both status active, these have the same rank 
     if (isData1StatusActive && isData2StatusActive){ 
      return 0; 
     } 

     if (isData1StatusActive){ 
      return -1; 
     } 

     if (isData2StatusActive){ 
      return 1; 
     } 
     // if no status active, these have the same rank 
     return 0; 
    } 

} 

注意,它假定getStatusStringValue()從不返回null。
否則在引用它之前添加必要的檢查。

相關問題