2017-11-18 154 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。
否则在引用它之前添加必要的检查。

相关问题