每次我需要实现一个比较器时,我都会试图记住什么时候应该返回 -1 和什么时候返回 1,我必须查找它。
我的意思是,显然 -1 是less,所以它意味着first
小于second
。但每当我对自己这么说时,我都会唠叨“你确定吗?” 感觉。我怀疑我的部分困惑来自于每当我需要降序排序时以相反的方式实现它。
你用什么来记住哪个是哪个?
每次我需要实现一个比较器时,我都会试图记住什么时候应该返回 -1 和什么时候返回 1,我必须查找它。
我的意思是,显然 -1 是less,所以它意味着first
小于second
。但每当我对自己这么说时,我都会唠叨“你确定吗?” 感觉。我怀疑我的部分困惑来自于每当我需要降序排序时以相反的方式实现它。
你用什么来记住哪个是哪个?
我使用这个简单的“减法”助记符:
first - second
因此,如果first
“小于”,second
您将得到负面结果,否则 - 如果它们相等,则为正或零。
comparator.compare(a, b) < 0
<==>a < b
我不确定你所说的助记符是什么意思。然而,我也有过类似的认知失调。
我很直观,所以我使用数字线(我在小学教过的那个)。我只是将负数可视化为“左”,将 0 可视化为“中心”,将正数可视化为“右”。对应于事实:-1 < 0 < 1
我记得基本整数情况(伪代码):
int comparator(int a, int b) {
return a-b;
}
因此,如果我们给出一个小的a
和一个大的b
,这是第一个 < 最后一个,我们会得到一个否定的结果。
我有更多的视觉记忆,所以记住那个函数的“结构”对我来说很容易和自然。
我曾经在实现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;
}