Возвращаемое значение на самом деле не имеет значения, поскольку контракт compareTo
должен возвращать отрицательное, положительное значение или 0 (как вы уже знаете).
Однако, если вы действительно хотите понять, почему -31
возвращается при сравнении Dog
с cat
(или любой другой строкой), вы можете просто посмотреть на метод непосредственно в классе String
:
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
Имейте в виду, что value
— это массив char
, поддерживающий строку.
private final char value[];
Так как же работает этот метод?
- Вы получаете минимальную длину обеих строк в переменной
lim
.
- Вы создаете копию массива строковых символов.
- Вы перебираете каждый символ (проверяя, равны ли они), пока не достигнете нижнего предела.
- Если два символа с одинаковым индексом не равны, вы возвращаете результат вычитания второго из первого.
char
может быть представлено как значение int
(которое принимает значение ascii) и уже упорядочено. Таким образом, при вычитании будет возвращено отрицательное число, если второй символ «больше», чем первый. Положительный результат будет возвращен, если второй символ "ниже", чем первый. 0 будет возвращено, если оба равны.
- Если все символы были равны во время цикла для наименьшей длины строки, вы возвращаете вычитание обеих длин.
В вашем примере первая буква обоих слов не равна, поэтому вы можете сравнить D
с c
, которые соответственно представлены как 68
и 99
. Вычтите 99 из 68, и вы получите -31.
Итак, чтобы ответить на этот вопрос:
Означает ли это, что возвращаемое int — это количество мест, в которых строки находятся друг от друга, если их нужно отсортировать в алфавитном порядке, как в словаре?
Нет, на самом деле это либо разница между двумя несовпадающими значениями ascii char, либо разница обеих длин.
Кроме того, как метод справляется с чувствительностью к регистру? Являются ли строчные буквы первыми в строке перед прописными? Есть ли график для этого?
Если вы хотите игнорировать регистр при сравнении, вы можете использовать String#compareToIgnoreCase
.
Также вы можете проверить эту диаграмму для значений ascii (верхний и нижний регистр).
person
Jean-François Savard
schedule
16.09.2015
String
. - person Dmitry Zaytsev   schedule 16.09.2015