首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TimSort违规

TimSort违规
EN

Stack Overflow用户
提问于 2019-05-01 22:48:03
回答 1查看 59关注 0票数 0

这个比较器方法有什么问题?

我读过:Java error: Comparison method violates its general contract

并理解如果c1 > c2,并且c2 > c3,那么c1 > c3。我相信这一点在上面应该是正确的。

getMaxCosine()返回介于0..1之间的值,第二次排序是根据卡片中文本的长度,排序越长排名越高。

代码语言:javascript
复制
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;
   }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-01 23:35:53

我认为您的问题出在您的if-else代码块中:

代码语言:javascript
复制
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代码块中将>=比较改为仅>

代码语言:javascript
复制
else if (getMaxCosine(c1) == getMaxCosine(c2)) {
       if (getMatchingText(c1).length() == getMatchingText(c2).length()) return 0;
       return getMatchingText(c1).length() > getMatchingText(c2).length() ? -1  : 1;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55938101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档