此比较器方法有什么问题?
我已阅读: Java error: Comparison method violates its general contract
并了解,如果c1> c2,并且c2> c3,则c1> c3。我相信以上情况也应如此。
getMaxCosine()返回0..1之间的值,第二种排序是根据卡中文本的长度,排名越高的时间越长。
public int compare(Card c1, Card c2) {
if (getMaxCosine(c1) > getMaxCosine(c2)) {
return -1;
} else if (getMaxCosine(c1) == getMaxCosine(c2)) {
return getMatchingText(c1).length() >= getMatchingText(c2).length() ? -1 : 1;
} else {
return 1;
}
}
答案 0 :(得分:1)
我认为您的问题出在您的if
-else
区块中:
else if (getMaxCosine(c1) == getMaxCosine(c2)) {
return getMatchingText(c1).length() >= getMatchingText(c2).length() ? -1 : 1;
}
如果getMatchingText(c1).length()
等于getMatchingText(c2).length()
,则返回-1
。这将产生“不稳定”排序:换句话说,两个具有相等值的对象的排序将在排序后颠倒。此外,对于在此比较器下相等的Card
,您应该返回0。我建议在此>=
->
块中将if
的比较更改为仅else
:
else if (getMaxCosine(c1) == getMaxCosine(c2)) {
if (getMatchingText(c1).length() == getMatchingText(c2).length()) return 0;
return getMatchingText(c1).length() > getMatchingText(c2).length() ? -1 : 1;
}