Является ли неравенство транзитивным в Java? - PullRequest
2 голосов
/ 07 сентября 2011

Если у меня есть 3 объекта a , b и c , и я хочу проверить, что ни один из них не равен друг другу, мне нужно проверить:

if (!a.equals(b) && !b.equals(c) && !a.equals(c)) { // to simplify, assume non-null
    // do something
}

Согласно документам Java, для правильно реализованного метода equals:

Это транзитивно: для любых ненулевых ссылочных значений x, y и z, если x.equals (y) возвращает true, а y.equals (z) возвращает true, тогда x.equals (z) должен вернуть true.

Это говорит о том, что равенство транзитивно, , но как насчет неравенства ?

Ответы [ 5 ]

6 голосов
/ 07 сентября 2011

Это не транзитивно.Рассмотрим x=1, y=2 и z=1.

3 голосов
/ 07 сентября 2011

дано a = 5; b = 6; c = 5:

a! = B -> true

b! = C -> true

a! = C -> false

так что нет, неравенство не является переходным.

3 голосов
/ 07 сентября 2011

Неравенство никогда не бывает переходным (если у вас есть 2 элемента, которые не равны, a и b). Потому что тогда у вас есть! A.equals (b) и из-за симметрии! B.equals (a), но из-за идентификации у вас есть a.equals (a). Так что неравенство не может быть переходным.

1 голос
/ 07 сентября 2011

Ну нет. Для транзитивности вам нужно условие true для any x, y, z; но если я выберу z == x, я бы очень надеялся, что

x != y

и y! = z

НЕ означает

x != z

, поскольку z равно x!

1 голос
/ 07 сентября 2011

Нет, конечно, нет.

2 != 3
3 != 2

, но

2 == 2
...