雖然我使用下面的比較器對一個對象進行排序,但我得到的比較方法違反了它在比較器中的一般合同問題。Java 8比較方法違反了它在比較器中的一般合同問題
final Set<Span> set = new TreeSet<Span>(new Comparator<Span>() {
public int compare(final Span firstSpan, final Span secSpan) {
BigInteger s1X0 = firstSpan.getCoordinates().getX0();
BigInteger s1X1 = firstSpan.getCoordinates().getX1();
BigInteger s2X0 = secSpan.getCoordinates().getX0();
BigInteger s2X1 = secSpan.getCoordinates().getX1();
BigInteger s1Y0 = firstSpan.getCoordinates().getY0();
final BigInteger s2Y0 = secSpan.getCoordinates().getY0();
if(s1X0.intValue() == s2X0.intValue() && s1X1.intValue() == s2X1.intValue() && s1Y0.intValue() == s2Y0.intValue()){
return 0;
}
if ((s1Y0.intValue() - s2Y0.intValue() <= 5) && (s1Y0.intValue() - s2Y0.intValue() >= -5)) {
return (s1X0.intValue()>s2X0.intValue()) ? 1 : -1;
} else {
if ((s1X0.intValue() >= s2X0.intValue() && s1X0.intValue() <= s2X1.intValue())
|| (s2X0.intValue() >= s1X0.intValue() && s2X0.intValue() <= s1X1.intValue())) {
return (s1Y0.intValue() > s2Y0.intValue()) ? 1 : -1;
} else {
return s1X0.intValue() > s2X0.intValue() ? 1 : -1;
}
}
}
});
鑑於您調用了'intValue()'24次,爲什麼不只是製作's1X0'等'int'變量?這會讓你更容易幫助你,而且你的代碼更易於閱讀。 –
如果你告訴我們你想要達到的目標,並且理想地提供一個展示問題的[mcve],那麼這也會有所幫助 - 舉個具體的例子,我們應該很容易向你展示你的比較不一致的地方。 –
你明白那個錯誤信息的含義嗎?仔細閱讀['java.util.Comparator']的API文檔(http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html),它解釋了實現的要求'比較'方法。您的實施違反了這些要求,因此您必須檢查您的代碼並進行調整以確保其符合要求。 – Jesper