Что возвращает метод compareTo() классов String

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

Вот оператор if:

String a = "abd";
String b = "abc";

if(a.compareTo(b) >= 1)

возвращает true, так как строка a больше лексикографически.

Мой вопрос: всегда ли compareTo возвращает 0, 1 или -1? или он возвращает фактическую сумму, что строка больше или меньше строкового аргумента.

Итак, в приведенном выше выражении if, поскольку «abd» на единицу больше, чем «abc», возвращает ли он 1?


person cupojava    schedule 14.09.2013    source источник
comment
Просто попробуй : System.out.println(a.compareTo(b))   -  person rocketboy    schedule 14.09.2013
comment
документы. oracle.com/javase/7/docs/api/java/lang/   -  person jmj    schedule 14.09.2013
comment
Эти ответы небезопасны; возвращаемое значение (хотя почти всегда -1, 0 или 1) зависит от реализации.   -  person chrylis -cautiouslyoptimistic-    schedule 14.09.2013
comment
Вы не должны предполагать больше, чем написано в документации, а в документации сказано только: 0, меньше 0 или больше 0. Вы можете посмотреть на реализацию, но на другой реализации Java она может быть другой, и ваша программа не будет Работа.   -  person Jesper    schedule 14.09.2013


Ответы (3)


Насколько вам известно, неизвестно, какова величина возвращаемого значения compareTo, только знак. На практике большинство реализаций compareTo возвращают -1, 0 или 1, но в контракте конкретно указано положительное или отрицательное значение, и вы должны соответствующим образом написать свой код (например, используя int compare = a.compareTo(b); if(compare > 0) {...} else...).

person chrylis -cautiouslyoptimistic-    schedule 14.09.2013
comment
Это был простой пример, но я хотел бы знать, действительно ли он вычисляет разницу между двумя строками. - person cupojava; 14.09.2013
comment
Вы можете посмотреть источник класса OpenJDK String. В этом случае, да, это прямое вычитание двух значений char, чтобы избежать ветвления. - person chrylis -cautiouslyoptimistic-; 14.09.2013

Согласно http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#compareTo%28java.lang.String%29

В этом случае compareTo возвращает разницу двух значений символов в позиции k > в двух строках, то есть значение:

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

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

this.length()-anotherString.length()

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

person Diego C Nascimento    schedule 14.09.2013
comment
это похоже на то! но они недостаточно конкретны, чтобы я чувствовал себя комфортно, полагаясь на это предположение. - person cupojava; 14.09.2013
comment
Если документация лжет о реализации по умолчанию, то да, вы не можете чувствовать себя комфортно - person Diego C Nascimento; 14.09.2013

Falmarri полностью ответил на этот вопрос; в отличие от указания только условий, при которых возвращаемое значение будет положительным, отрицательным или нулевым.

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

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

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

this.length()-anotherString.length()"

person CrippledTable    schedule 07.11.2019