У кого-нибудь есть полезная мнемоника для реализации Comparator?
Каждый раз, когда мне нужно реализовать компаратор, я застреваю, пытаясь вспомнить, когда я должен вернуть -1, а когда 1, и мне приходится искать его.
Я имею в виду, очевидно, -1 меньше, поэтому это означает, что first
меньше чем second
, Но всякий раз, когда я говорю это себе, я получаю это нытье "ты уверен?" чувство. Я подозреваю, что часть моего замешательства связана с его реализацией наоборот, когда мне нужен нисходящий тип.
Что вы используете, чтобы запомнить, что есть что?
5 ответов
Я использую эту простую мнемонику "вычитание":
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;
}