每次我需要实现一个比较器时,我都会陷入困境,试图记住何时应该返回-1和1时,我必须查找它。
我的意思是,显然-1是 less ,因此它意味着first
小于second
。但每当我对自己这么说时,我都会唠叨“你确定吗?”感觉。我怀疑我的困惑部分来自于在我需要降序时反过来实现它。
你用什么来记住哪个是哪个?
答案 0 :(得分:10)
我使用这个简单的“减法”助记符:
first - second
因此,如果first
“小于”second
,您将获得否定结果,否则 - 如果相等则为正数或零。
答案 1 :(得分:5)
我不确定您的助记符是什么意思。但是,我的认知失调非常相似。
我非常直观,所以我使用数字线(我在小学就读的那个)。我只是将负数可视化为“左”,将0视为“中心”,将正数视为“右”。这对应于事实:-1< 0< 1
答案 2 :(得分:5)
comparator.compare(a, b) < 0
&lt; ==&gt; a < b
答案 3 :(得分:2)
我记得基本整数情况(伪代码):
int comparator(int a, int b) {
return a-b;
}
因此,如果我们提供一个小a
和一个大b
,这是第一个&lt;最后我们得到了一个否定的结果。
我有更多的视觉记忆,所以记住这个功能的“结构”对我来说既简单又自然。
答案 4 :(得分:0)
我过去常常在实现 Comparator
和 Comparable
接口时查看文档。
问题:比较a和b
让我们先看看升序,因为降序将与我们所做的一切相反。
问题可以翻译成给定两个数字a和b,你会怎么把它们放在数轴上?
如果 a < b,那么我们将把 a
放在消极的一边,把 b
放在积极的一边。
否则如果 a = b 那么我们将两者都放在中心(在 0)
否则 b
将在消极方面,a
将在积极方面。
比较器实现:
在这里,您将 a
与 b
进行比较。
@Override
public int compare(MyClass a, MyClass b) { //always good to rename your variables like this to be consistent
return a.f1 - b.f1;
}
可比实现:
在这里,您将 this
与 other
进行比较。
@Override
public int compareTo(MyClass other) { // this is same as compare(this, other)
return this.f1 - o.f1;
}