Имеет ли значение конкретное целое число со знаком при реализации CompareTo в классе Comparable <Type>? - PullRequest
8 голосов
/ 14 апреля 2010

При реализации 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)

Ответы [ 2 ]

4 голосов
/ 14 апреля 2010

Интересный вопрос, но, тем не менее, величина int не имеет значения согласно спецификациям Comparable<T> и Comparator<T>, только знак.Возможно, какой-то алгоритм сортировки может дополнительно указывать, что они могут принимать «подсказки» от величины, но я не уверен, насколько это целесообразно для сортировки на основе сравнения, поскольку нам действительно нужно только знать, если a < b, 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 < z, и все же x - z является положительным числом.Остерегайтесь использования этой идиомы вычитания: всегда намного безопаснее делать явное сравнение и вместо этого return -1, 0 или 1.

2 голосов
/ 14 апреля 2010

нет, единственная разница между отрицательными числами, 0 и положительными числами. степень не имеет значения.

...