14

每次我需要实现一个比较器时,我都会试图记住什么时候应该返回 -1 和什么时候返回 1,我必须查找它。

我的意思是,显然 -1 是less,所以它意味着first小于second。但每当我对自己这么说时,我都会唠叨“你确定吗?” 感觉。我怀疑我的部分困惑来自于每当我需要降序排序时以相反的方式实现它。

你用什么来记住哪个是哪个?

4

5 回答 5

10

我使用这个简单的“减法”助记符:

first - second

因此,如果first“小于”,second您将得到负面结果,否则 - 如果它们相等,则为正或零。

于 2011-03-30T14:00:49.060 回答
6

comparator.compare(a, b) < 0<==>a < b

于 2011-03-30T14:18:06.750 回答
5

我不确定你所说的助记符是什么意思。然而,我也有过类似的认知失调。

我很直观,所以我使用数字线(我在小学教过的那个)。我只是将负数可视化为“左”,将 0 可视化为“中心”,将正数可视化为“右”。对应于事实:-1 < 0 < 1

于 2011-03-30T14:02:27.780 回答
2

我记得基本整数情况(伪代码):

int comparator(int a, int b) {
   return a-b;
}

因此,如果我们给出一个小的a和一个大的b,这是第一个 < 最后一个,我们会得到一个否定的结果。

我有更多的视觉记忆,所以记住那个函数的“结构”对我来说很容易和自然。

于 2011-03-30T14:02:44.837 回答
0

我曾经在实现ComparatorComparable接口时总是检查文档。

问题:比较 a 和 b
让我们先看一下升序,因为降序将与我们所做的一切相反。
问题可以翻译成给定两个数字 a 和 b,你会如何将它们放在数轴上?
如果a < b,那么我们将放在a消极的一面和b积极的一面。
否则,如果 a = b,那么我们将把两者都放在中心(在 0 处),
否则b将位于负侧并a位于正侧。

在此处输入图像描述

比较器实现:
在这里您要ab.

 @Override
    public int compare(MyClass a, MyClass b) { //always good to rename your variables like this to be consistent 
        return a.f1 - b.f1; 
    }

可比较的实现:
在这里您要thisother.

@Override
    public int compareTo(MyClass other) { // this is same as compare(this, other)
        return this.f1 - o.f1;
    }
于 2020-12-22T18:56:07.803 回答