При реализации compareTo (), должна быть принята во внимание степень "различия"?
Например, если у меня есть 3 объекта, C1, C2 и C3, такой что C1 C1.compareTo(C2) должен возвратить целое число, которое является меньше, чем C2.compareTo(C3)? Документация для интерфейса Comparable, кажется, не указывает так или иначе, таким образом, я предполагаю, что градус не имеет значения, но было бы хорошо знать, существует ли некоторое преимущество, возвращая определенное число (например, улучшая скорость вида TreeSet или что-то). http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Comparable.html#compareTo (T)
Интересный вопрос, но тем не менее нет, величина int
не имеет значения согласно спецификациям Comparable
и Comparator
, только знак. Возможно, какой-то алгоритм сортировки может дополнительно указать, что они могут брать «подсказки» по величине, но я не уверен, насколько это практично для сортировки на основе сравнения, поскольку нам действительно нужно только знать, если a ,
a == b
или a> b
(это действительно то, что Comparable
и Comparator
являются абстракциями ООП).
Теперь нужно сказать, что здесь может быть скрытое намерение использования идиомы вычитания для сравнения числовых значений, то есть что-то вроде этого:
public int compare(T t1, T t2) {
return t1.intField - t2.intField;
}
Обратите внимание, что этот метод сравнения потенциально не работает , из-за возможного переполнения, когда разница между двумя числами больше, чем Integer.MAX_VALUE
. Фактически, это одна из загадок, описанных в Java Puzzlers .
В качестве демонстрации рассмотрим следующий фрагмент (взятый из книги):
int x = -2000000000;
int z = 2000000000;
System.out.println(x - z); // prints a positive number due to overflow
Ясно x
x - z
является положительным числом. Остерегайтесь использования этой идиомы вычитания: всегда гораздо безопаснее выполнить явное сравнение и вместо этого вернуть -1
, 0
или 1
.
нет, единственная разница между отрицательными числами, 0 и положительными числами. степень не имеет значения.