Сравнение утверждений в Java - PullRequest
1 голос
/ 30 января 2012
String title ="A";
int year = 2009;
String director = "Zebra";

String title1 ="B";
int year1 = 2010;
String director1 = "Zzz";

VideoObj a = new VideoObj(title,year,director);
VideoObj b = new VideoObj(title2,year,director);

Assert.assertTrue( a.compareTo(b) == -b.compareTo(a) );

Что означает - в выражении Assert.assertTrue( a.compareTo(b) == -b.compareTo(a) ); ???

Пожалуйста, могу я получить объяснение?

Спасибо

Ответы [ 6 ]

4 голосов
/ 30 января 2012

означает из - - отрицание, простое и понятное.Я видел эту идиому в числовых сравнениях, которые возвращают значение -1, 0 или +1, в зависимости от сравнения.Хотя это сработало бы и для тех, кто возвращает величину, -n, 0, +n (где n идентичен).

Просто проверяется, что compareToОперации дают вам противоположное значение при обращении операндов.Другими словами, это утверждение, что compareTo функционирует как ожидалось (но не обязательно так, как гарантировано - см. Ниже).

Если a < b и b < a (то есть, a оба меньше, чем, и больше, чем b), тогда у вас есть серьезная проблема, которую необходимо исправить: -)

Из CompareTo документации :

Разработчик должен обеспечить sgn (x.compareTo (y)) == -sgn (y.compareTo (x)) для всех x и y.

В вышеприведенном описании обозначение sgn (expression) обозначает математическую функцию signum, которая определена для возврата одного из значений -1, 0 или 1 в зависимости от того, является ли значение выражения отрицательным, нулевым или положительным.

На основании этогоутверждение не совсем верно, оно должно сравнивать Integer.signum (a.compareTo (b)), а не просто a.compareTo (b), если только у него нет дополнительных знаний о том, что реализация CompareTo гарантированно возвращает симметричные (около нуля) значения.

1 голос
/ 30 января 2012

Как написано, оператор даже не делает то, что выглядит как должен ...

Строка должна быть

Assert.assertTrue(Integer.signum(a.compareTo(b)) == -Integer.signum(b.compareTo(a));

, и он проверяет, что порядок антисимметричный , то есть, если a < b, то b > a и т. Д., Как порядок должен быть по определению.

1 голос
/ 30 января 2012

Assert.assertTrue вызовет исключение, если переданное вами сравнение ложно

Эта строка проверяет, получаете ли вы постоянные значения для CompareTo.

CompareTo должно быть симметричным и вы можетепроверьте это, изменив порядок операндов и умножив результат на -1

0 голосов
/ 30 января 2012

a.compareTo (b);

этот метод: возвращает 1, если a> b возвращает -1, если b> a возвращает 0, если a = b

, поэтому он будет изменен на a> b - b> a и b> a - a> b

a.compareTo (b) и -b.compareTo (a) одинаковы.

0 голосов
/ 30 января 2012

Было бы полезно увидеть реализацию compareTo, но в основном утверждение проверяет, что a <= b подразумевает b >= a для определенных критериев сравнения (не буквальный <= и >= операторов по номерам). Если сравнение не удается, это означает, что метод compareTo работает не так, как ожидалось.

При наличии данной информации одна возможность состоит в том, что VideoObj a "меньше чем" VideoObj b, если заголовок a меньше, чем заголовок b в лексикографическом порядке.

0 голосов
/ 30 января 2012

См. http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Comparable.html#compareTo%28java.lang.Object%29

Я думаю, что это тестирование, что метод compareTo() реализован правильно.

Для любой реализации интерфейса Comparable

a.compareTo(b) == -b.compareTo(a)

должно всегда быть верным.Если это не так, вы получите бессмысленные результаты при выполнении операций, использующих compareTo (), таких как сортировка объектов.

Обновление : ОК, ОК, только знак должен быть напротив, чтобы Comparable работал правильно!- но проверка того, что значения равны и имеют противоположный знак, гарантирует это - это просто более строгий тест, чем, строго говоря, строго требуется.

...