在尝试了3个小时后,我找到的所有解决方案都没有成功,我在这里发布了我的问题。我得到了例外:
java.lang.IllegalArgumentException:比较方法违反了其一般合同
这是我的代码:
public int compare(InstrumentModel o1, InstrumentModel o2) {
int c = 0;
if(c == 0 && o1.getUnderlyingAsset()!=null) {
c = o1.getUnderlyingAsset().compareTo(o2.getUnderlyingAsset());
}
if(c == 0 && o1.getSymbol()!=null) {
c = o1.getSymbol().compareTo(o2.getSymbol());
}
if(c == 0 && o1.getExpiryDateInDate()!=null && o2.getExpiryDateInDate()!=null) {
DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
Date date1 = null;
Date date2 = null;
try {
date1 = df.parse(df.format(o1.getExpiryDateInDate()));
date2 = df.parse(df.format(o2.getExpiryDateInDate()));
} catch (ParseException e) {
e.printStackTrace();
}
c = date1.before(date2) ? 1 : date1.after(date2) ? -1 : 0 ;
}
return c;
}
答案 0 :(得分:3)
您对空值的处理不当。
如果其中一个比较的InstrumentModel
具有null
getExpiryDateInDate
而另一个具有非空值,则不应返回0.
你应该保持一致。例如:
o1.getExpiryDateInDate()!=null
&& o2.getExpiryDateInDate()==null
,返回1
o1.getExpiryDateInDate()==null
&& o2.getExpiryDateInDate()!=null
,返回-1。null
运行您的日期比较代码才能确定要返回的内容。注意:您对null
资产和符号属性的处理也看起来并不好,但也许它们永远不会null
(或者至少如果有一个值,另一个也有价值)。否则,如果o1.getUnderlyingAsset().compareTo(o2.getUnderlyingAsset())
为o2.getUnderlyingAsset()
,则null
等比较可能会导致问题(取决于getUnderlyingAsset()
的类型及其实现方式compareTo
)。