Разница между равными и методом сравнения в строке Java - PullRequest
0 голосов
/ 27 августа 2010

На самом деле я сравниваю две строки, которые возвращают true, когда я использую метод equals. Принимая во внимание, что когда я использую метод CompareTo, он возвращает 22.

Также я хочу знать, в каком месте эти две строки отличаются. Используя Java, как я могу найти это?

Заранее спасибо.

Ответы [ 7 ]

2 голосов
/ 27 августа 2010

В соответствии с документацией compareTo ()

[...] Если две строки разные, то либо они имеют разные символы в некотором индексе, который является допустимым индексом для обеих строк, либоих длины разные или оба.Если они имеют разные символы в одной или нескольких позициях индекса, пусть k будет наименьшим таким индексом;затем строка, символ которой в позиции k имеет меньшее значение, как определено с помощью оператора <, лексикографически предшествует другой строке.В этом случае CompareTo возвращает разность двухсимвольных значений в позиции k в двух строках, то есть значение: </p>

 this.charAt(k)-anotherString.charAt(k)

Если нет позиции индекса, в которой они отличаются, тоболее короткая строка лексикографически предшествует более длинной строке.В этом случае, CompareTo возвращает разницу длин строк, то есть значение:

 this.length()-anotherString.length()

Следовательно, 22 не является положением отличающегося символа в двух строках,но расстояние между первыми непохожими символами.

Что касается вашего второго вопроса, я считаю, что простая итерация по символам в обеих строках позволит вам легко определить первую позицию символа, где они различаются

1 голос
/ 27 августа 2010

Это очень странный результат, поскольку в контракте на compareTo(String) сказано, что два равных объекта, определенных методом equal, должны быть равны, также определенным методом compareTo:

из javadoc String#compareTo(String):

"Возвращает: значение 0, если строка аргумента равна этой строке; значение меньше 0, если эта строка лексикографически меньше аргумента строки; и значение больше 0, если эта строка лексикографическибольше строкового аргумента. "

Не могли бы вы опубликовать эти две строки?

0 голосов
/ 02 марта 2016

равно - сравнивает содержимое 2 строк и возвращает true, если оба содержимого одинаковы, в противном случае false.

compareto - сравнивает 2 строки и возвращает положительное значение, если в первой строке больше символов нет, чем во второйодин.Возвращает отрицательное значение, если 1-я строка меньше 2-й, и 0, если оба равны.

0 голосов
/ 27 августа 2010

Что-то здесь серьезно не так.Скорее всего, вы сравниваете разные пары строк, когда сравниваете их с equals и с compareTo.

Шансы Sun на реализацию String, получающие эту ошибку, равны нулю (IMO).И то же самое относится к любой реализации поставщика, основанной на кодовой базе Sun.Вполне возможно, что в какой-то кодовой базе, отличной от Sun, может быть ошибка в реализации String, но такого рода вещи могли бы появиться в коде других людей много лет назад.

Для справки:контракт на equals и compareTo заключается в том, что equals возвращает true, когда compareTo возвращает 0 и наоборот .Ваше наблюдение, если оно правильное, нарушает это.Но это большое «если».

0 голосов
/ 27 августа 2010

Если CompareTo возвращает 22, это означает, что строка не равна.Метод equals должен показывать false.Не могли бы вы показать нам свой код?

0 голосов
/ 27 августа 2010

Согласно String сравнить с (String anotherString),

Возвращает: значение 0, если строка аргумента равна этой строке; значение меньше 0, если эта строка лексикографически меньше строкового аргумента; и значение больше 0, если эта строка лексикографически больше строкового аргумента.

Таким образом, если обе строки равны, их сравнение должно вернуть 0.

0 голосов
/ 27 августа 2010

Обычно методы CompareTo показывают, если строка, заданная в качестве аргумента, лексикографически равна (возвращает 0), больше (возвращает что-то <0) или меньше (возвращает что-то> 0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...