Это не прямой ответ, а важное примечание об использовании compareTo ().
При проверке значения compareTo () всегда проверяйте для x < 0
, x > 0
и x == 0
.
Не проверять на x == 1
Из Comparable.compareTo () Javadocs:
Сравнивает этот объект с указанным объектом для заказа. Возвращает отрицательное целое число, ноль или положительное целое число, так как этот объект меньше, равен или больше указанного объекта.
Примечание:
A negative integer
, а не -1
.
A positive integer
, а не 1
.
Правда, проверка для ==1
и ==-1
будет работать для BigInteger
. Это BigInteger.compareTo()
код:
public int compareTo(BigInteger val) {
if (signum == val.signum) {
switch (signum) {
case 1:
return compareMagnitude(val);
case -1:
return val.compareMagnitude(this);
default:
return 0;
}
}
return signum > val.signum ? 1 : -1;
}
Но это все еще плохая практика, и она явно рекомендуется в JavaDocs :
Сравнивает этот BigInteger с указанным BigInteger. Этот метод предоставляется в предпочтении отдельным методам для каждого из шести логических операторов сравнения (<, ==,>,> =,! =, <=). <strong>Предлагаемая идиома для выполнения этих сравнений: (* 1046 *), где <op>
- один из шести операторов сравнения.