TimSort 违规
TimSort violation
这个比较方法有什么问题?
我已阅读:
Java error: Comparison method violates its general contract
并理解如果c1 > c2,且c2 > c3,则c1 > c3。我相信这在上面应该适用。
getMaxCosine() returns取值在0..1之间,第2排序是按照卡片中文字的长度,越长排名越高。
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;
}
}
我认为您的问题出在您的 if
-else
区块中:
else if (getMaxCosine(c1) == getMaxCosine(c2)) {
return getMatchingText(c1).length() >= getMatchingText(c2).length() ? -1 : 1;
}
如果getMatchingText(c1).length()
等于getMatchingText(c2).length()
那么你return-1
。这会产生一个 "unstable" 排序:换句话说,两个具有相等值的对象的顺序将在排序后反转。此外,对于在此比较器下相等的 Card
,您应该 return 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;
}
这个比较方法有什么问题?
我已阅读: Java error: Comparison method violates its general contract
并理解如果c1 > c2,且c2 > c3,则c1 > c3。我相信这在上面应该适用。
getMaxCosine() returns取值在0..1之间,第2排序是按照卡片中文字的长度,越长排名越高。
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;
}
}
我认为您的问题出在您的 if
-else
区块中:
else if (getMaxCosine(c1) == getMaxCosine(c2)) {
return getMatchingText(c1).length() >= getMatchingText(c2).length() ? -1 : 1;
}
如果getMatchingText(c1).length()
等于getMatchingText(c2).length()
那么你return-1
。这会产生一个 "unstable" 排序:换句话说,两个具有相等值的对象的顺序将在排序后反转。此外,对于在此比较器下相等的 Card
,您应该 return 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;
}