У кого-нибудь есть полезная мнемоника для реализации Comparator?

Каждый раз, когда мне нужно реализовать компаратор, я застреваю, пытаясь вспомнить, когда я должен вернуть -1, а когда 1, и мне приходится искать его.

Я имею в виду, очевидно, -1 меньше, поэтому это означает, что first меньше чем second, Но всякий раз, когда я говорю это себе, я получаю это нытье "ты уверен?" чувство. Я подозреваю, что часть моего замешательства связана с его реализацией наоборот, когда мне нужен нисходящий тип.

Что вы используете, чтобы запомнить, что есть что?

5 ответов

Решение

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

Я использую эту простую мнемонику "вычитание":

first - second

Так что если first меньше чем second вы получите отрицательный результат, в противном случае - положительный или ноль, если они равны.

Я не уверен, что вы подразумеваете под мнемоникой. Однако у меня был очень похожий когнитивный диссонанс.

Я очень нагляден, поэтому использую числовую линию (ту, которой меня учили в начальной школе). Я просто визуализирую отрицательные числа как "влево", 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, то мы поместим оба в центр (в 0) , в
противном случае они будут на отрицательной стороне и будут на положительной стороне.

Реализация компаратора:
здесь вы сравниваете 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;
    }
Другие вопросы по тегам